提问人:dog bytes 提问时间:2/27/2023 更新时间:2/27/2023 访问量:40
质疑代码的执行顺序 [重复]
Questioning the order in which the code is executed [duplicate]
问:
所以我偶然发现了这段代码(Java - 构造函数没有显式调用超类构造函数,Java 也没有插入一个)......
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赞
Miss Skooter
2/27/2023
#1
继承类在构造函数的开头隐式调用。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')
评论
this(...)
super(...)
super()
C
super();