质疑代码的执行顺序 [重复]

Questioning the order in which the code is executed [duplicate]

提问人:dog bytes 提问时间:2/27/2023 更新时间:2/27/2023 访问量:40

问:

所以我偶然发现了这段代码(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,但我就是无法理解代码的执行顺序。

我想要一个详细的解释,只是为了确保我足够清楚地理解事情。谢谢!

Java 序列 扩展

评论

2赞 Jon Skeet 2/27/2023
提示:如果一个构造函数没有通过 or 显式委托给另一个构造函数,则等价于拥有 .因此,想象一下用于 starts 的无参数构造函数 - 这会消除您的困惑吗?this(...)super(...)super()Csuper();
0赞 dog bytes 2/27/2023
哦,是的,我忘记了即使没有显式调用 super(),谢谢!

答:

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')