java - 关于在Java中使用继承时的构造函数初始化顺序

标签 java inheritance constructor

我正在尝试做“Thinkking in Java 4th edition”中的练习“reusing/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");

    }

}

最佳答案

创建 C2 实例时,首先要执行的是 A2(父类(super class))构造函数,这会导致 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);
    }
}

关于java - 关于在Java中使用继承时的构造函数初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925302/

相关文章:

php - 类继承、代码分解、php 对象模型

PHP > 5.4 : overriding constructor with different signature

class - 以下方法如何使用保留给构造函数的 “syntactic sugar”?

java - 尽管混淆了真实的运行时方法名称?

java - 前端 Maven 插件不能 "bower install"

typescript - Typescript 中的类方法

c++ - 为什么我可以通过类而不是纯代码修改 const 变量。 C++

c++ - 为什么我需要一个构造函数?

javafx如何在辅助窗口关闭时保留数据

java - 等待 6 秒然后做某事