java - 关于在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");
}
}
解决方案
创建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);
}
}
推荐阅读
- c# - 使用 lock、Monitor Pulse 和 Wait 同步线程
- vue.js - 如何在 Vue.js 中动态切换没有值的 HTML 属性?
- python - 使用 EfficientNetB0 - 错误 - AttributeError:模块 'keras.utils' 没有属性 'get_file'
- java - 将比较器与 Treemap 一起使用会导致键重复
- node.js - 如何从 POSTMAN 发送 CSV 文件并在 nodejs 的后端读取该文件
- c# - c# Blazored.Typehead 方法的类型参数不能从用法中推断出来
- amazon-web-services - 用于跟踪 EMR 步骤执行成本的 AWS 标记
- python - OpenCV的Python tkinter GIL崩溃问题
- pyspark - 对透视列进行排名
- amazon-web-services - 如何防止机器人在我的 AWS Lambda 函数中产生成本