让我通过代码示例来解释我的问题,我有这个代码:
class A {
public A() {
System.out.println("In class A constructor");
}
static {
System.out.println("In class A static initializer");
}
}
class B extends A {
static {
System.out.println("In class B static initializer");
}
public B() {
System.out.println("In class B constructor");
}
}
public class C extends B {
public C() {
System.out.println("In class C constructor");
}
static {
System.out.println("In class C static initializer");
}
public static void main(String[] args) {
new C();
}
}
如果我们运行此代码,我们将打印出控制台:
在 A 类静态初始化器中
在 B 类静态初始化程序中
在 C 类静态初始化程序中
在 A 类构造函数中
在 B 类构造函数中
在 C 类构造函数中
如您所见,该类中的所有静态字段首先从 A 类调用到 B 类,然后是 C 类。然后我阅读了有关静态初始化程序的信息
类中声明的静态初始化器在类初始化时执行
我知道,如果我们只是查看构造函数。当我们调用时new C(),我们将有一个调用堆栈:
“5”Object()
“4”个A()电话super()
“3”个B()电话super()
“2”个C()电话super()
“1”main()电话new C()
那么为什么 A、B、C 类中的所有静态初始化器都先完成,然后是构造函数呢?这是否意味着如果 Java 中的类具有 IS-A 关系,它们会在堆栈序列中初始化?
我认为我的问题可以通过这里详细初始化过程来回答,但我对所有细节都迷失了。希望有人能给我解释一下。