java 质疑代码的执行顺序[duplicate]

5kgi1eie  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(88)
    • 此问题在此处已有答案**:

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,但我就是不能把我的头绕在代码执行的顺序上。
我想要一个详细的解释,只是为了确保我足够清楚地理解事情。谢谢!

aemubtdh

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')以完成函数。

相关问题