为什么this和super不能同时出现在一个构造函数里面?class A
{
A()
{
System.out.println("A");
}
}class B extends A
{
B()
{
// super(); //error
this(3);
System.out.println("B");
}
B(int x)
{
System.out.println("B2");
}
public static void main(String[] args)
{
B a=new B();
}
}关于this,super不是很理解。。就像上面那个例子。问1:不是每个构造函数默认第一条语句都是调用super么?反正默认也是加上,可是我加了super()以后反而会出错不加没事。问2:是不是所有构造函数里面第一条语句都会调用super?还是只要一个构造函数调用一个super()其它的就不在调用了?如果按照上面的运行。
我想是否应该是 先运行B()中默认的super(),这样,要先执行一次A()中的System语句,然后在回到B()中,继续运行this(3),在进入B(int x)
进入后在B(int x)中在默认运行super(),在回到B()中那么输出应该是
A
A
B2
B可是结果输出却是
A
B2
B
这好像说明super()只运行了一次。。那么是说this(3)中的super()没有运行么?
是不是不管子类有多少个构造方法,但调用super只调用一次?谢谢,麻烦不忙时候讲讲。
{
A()
{
System.out.println("A");
}
}class B extends A
{
B()
{
// super(); //error
this(3);
System.out.println("B");
}
B(int x)
{
System.out.println("B2");
}
public static void main(String[] args)
{
B a=new B();
}
}关于this,super不是很理解。。就像上面那个例子。问1:不是每个构造函数默认第一条语句都是调用super么?反正默认也是加上,可是我加了super()以后反而会出错不加没事。问2:是不是所有构造函数里面第一条语句都会调用super?还是只要一个构造函数调用一个super()其它的就不在调用了?如果按照上面的运行。
我想是否应该是 先运行B()中默认的super(),这样,要先执行一次A()中的System语句,然后在回到B()中,继续运行this(3),在进入B(int x)
进入后在B(int x)中在默认运行super(),在回到B()中那么输出应该是
A
A
B2
B可是结果输出却是
A
B2
B
这好像说明super()只运行了一次。。那么是说this(3)中的super()没有运行么?
是不是不管子类有多少个构造方法,但调用super只调用一次?谢谢,麻烦不忙时候讲讲。
楼主,看看这个 this与super用法
然而函数的入口是子类构造函数,因此任何构造函数第一句必须是执行父类构造函数,如果没有添加super关键字,那么编译器会为该构造函数第一句添加一个super()语句(你可以这么理解,当然编译以后并不是这样)。如果有super关键字显示的调用父类构造函数,就是用指定的那个父类构造函数,否则使用默认的无参数构造函数。也有一种情况例外,就是存在this关键字,调用本类其它构造函数,但是按照递归调用,最终还是会调用父类构造函数。
如果你继承的父类没有无参数构造函数,那么你这个类第一句必须显示的调用super关键字来调用父类对应的有参数构造函数,否则不能通过编译。
和super()
在构造方法中必须出现在第一行,一山不容二虎。
如果一个构造方法里没写this()和super()
那么默认就是super()。
一旦你写了this()或者super(),那么这个默认的就消失了。
这个我在前面已经解释过了,不再复述了,不过殊途同归,你即使使用this,还是会执行父类构造函数的,因为你this的那个构造函数,它的第一行也会调用父类构造函数的,你的构造函数中,必定会有一个使用super来调用父类构造函数,而其它的this()调用,最终会指向这个构造函数(构造函数不存在全部都能够this(参数)的情况)。