首页 > 解决方案 > 关于在Java中使用继承时的构造函数初始化序列

问题描述

我正在尝试在“Thingking in Java 第 4 版”中进行“重用/E07_SimpleInheritance2”练习。代码有效,但控制台中的输出是:

A: New instance C
B: New instance B
C: New instance C

但我认为C应该在B前面,因为这句话“System.out.println('C:' + str);” 是在 C2 的构造函数中,后面是实例 B。那么,为什么不呢?

好的,我刚刚在初始化时意识到,序列是:(静态变量,静态字段)>(变量,字段)>构造函数。这就是原因。问题解决了,谢谢楼上的大佬:)

class A2{
    A2(String str){
        System.out.println("A: " + str);
    }
}

class B2{
    B2(String str){
        System.out.println("B: " + str);
    }
}

class C2 extends A2{
    C2(String str){
        super(str);
        System.out.println("C: " + str); //I think it should work first
    }
    B2 b = new B2("New instance B"); //Then followed by B
}
public class Q7_7_SimpleInheritance2 {

    public static void main(String[] args) {
        C2 c = new C2("New instance C");

    }

}

标签: javainheritanceconstructor

解决方案


创建C2实例时,首先发生的是执行A2(超类)构造函数,这导致A: New instance C首先打印。

然后在的构造函数C2主体之前初始化的实例变量。C2因此B2 b = new B2("New instance B");在 之前执行System.out.println("C: " + str);B: New instance B第二个输出行和C: New instance C最后一行也是。

您可能对b在构造函数之后声明的实例变量感到困惑,但这没有任何意义。

如下更改代码可能会减少混乱,但会产生完全相同的输出:

class C2 extends A2 
{
    B2 b = new B2("New instance B");
    C2(String str){
        super(str);
        System.out.println("C: " + str);
    }
}

推荐阅读