- 此问题在此处已有答案**:
Java - Constructor does not explicitly invoke a superclass constructor, Java does not insert one either(1个答案)
7小时前关闭。
所以我偶然发现了这段代码(Java - Constructor does not explicitly invoke a superclass constructor, Java does not insert one either)...
public class App {
public static void main(String[] args){
new C();
new C(1.0);
}
}
class A {
public A(){
this(5);
System.out.println("a1");
}
public A(int x){
System.out.println("a2");
}
}
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");
}
}
class C extends B {
public C(){
System.out.println("c1");
}
public C(double x){
this();
System.out.println("c2");
}
}
得到的输出是a2 a1 b2 b3 b1 c1 a2 a1 b2 b3 b1 c1 c2
我希望它只是c1 c2,但我就是不能把我的头绕在代码执行的顺序上。
我想要一个详细的解释,只是为了确保我足够清楚地理解事情。谢谢!
1条答案
按热度按时间aemubtdh1#
继承类在构造函数的开头隐式调用
super()
。因此,执行如下:
C()
--〉B()
--〉A()
--〉A(5)
--〉print('a2')
--〉print('a1')
--〉B(false)
--〉B(2)
--〉print('b2')
--〉print('b3')
--〉print('b1')
--〉print('c1')
(这将完成对C()
的第一次调用)C(1.0)
--〉对a2、a1、b2、b3、b1、c1执行完全相同的轨迹,最后执行print('c2')
以完成函数。