首先,这是我在docs.oracle.com
上读到的内容注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。
但是当我测试我的代码时,class B
的无参数构造函数没有超类构造函数而且Java没有添加一个。为什么这样?这就是我的预期:
public B(){
super(); //<--- Why didn't Java add this superclass constructor?
this(false);
System.out.println("b1");
}
它是否与公共B()&#34;构造函数调用另一个构造函数,该构造函数调用另一个具有超类构造函数的构造函数吗?
我得到的输出是:a2 A1 B2 B3 B1 C1 a2 A1 B2 B3 B1 C1 C2
public class App {
public static void main(String[] args){
new C();
new C(1.0);
}
}
A类
public class A {
public A(){
this(5);
System.out.println("a1");
}
public A(int x){
System.out.println("a2");
}
}
B类
public class B extends A {
public B(){
this(false);
System.out.println("b1");
}
public B(int x){
super();
System.out.println("b2");
}
public B(boolean b){
this(2);
System.out.println("b3");
}
}
C类
public class C extends B {
public C(){
System.out.println("c1");
}
public C(double x){
this();
System.out.println("c2");
}
}
答案 0 :(得分:4)
对this(args)
的调用在其他任何事情之前进行评估。因此B()
调用B(boolean)
,调用B(int)
,明确调用super()
。