有一个代码是作为初级 Java 开发人员的任务给出的。我在五年内使用 Java,这段代码让我完全困惑:
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
输出将是:
Hello World!
variable value = null
但是,如果我们更改String variable = null;
为,String variable;
我们将拥有:
Hello World!
variable value = variable is initialized in B Class
第二个输出对我来说更清楚。因此,据我所知,Java 中的初始化顺序如下:
- 当我们来到这个根父类时,我们转到类层次结构的根(对于 Java,它始终是 Object 类):
- 初始化所有静态数据字段;
- 执行所有静态字段初始化器和静态初始化块;
- 初始化所有非静态数据字段;
- 执行所有非静态字段初始化器和非静态初始化块;
- 执行默认构造函数;
- 然后我们对底层子类重复该过程。
还有一篇文章描述this
了超类上下文中关键字的行为 - Calling base class overridden function from base class method
根据上面给出的规则,我假设有这样的顺序:
- 我们将创建一个新的 class 实例
B
; - 我们去零件课
Main
; - 初始化
main.variable
为空; - 然后我们转到 class 的默认构造函数
Main
; - 构造函数调用
b.printVariable()
类中的方法Main
;(为什么不调用main.printvariable
?我们这里没有this
关键词。) - 字段
b.variable
“变量在 B 类中初始化” - 现在我们回到课堂
B
; - 我们应该用空值初始化字段
b.variable
,对吗? B
执行的类的默认构造函数
请有人可以完整而完整地解释这个继承初始化序列是如何工作的。以及为什么更改String variable = null;
为String variable;
会导致另一个输出。