静态初始值设定项在构造函数之后运行,为什么?
2022-09-01 17:40:14
我有2个班级:
A类:
public class A {
static B b = new B();
static {
System.out.println("A static block");
}
public A() {
System.out.println("A constructor");
}
}
B类:
public class B {
static {
System.out.println("B static block");
new A();
}
public B() {
System.out.println("B constructor");
}
}
我创建了一个 Main 类,它只创建新的 A:
public class Main {
public static void main(String[] args) {
new A();
}
}
我得到的输出是:
B static block
A constructor
B constructor
A static block
A constructor
如您所见,A 的构造函数在其静态初始值设定项之前被调用。
我知道它与我创建的循环依赖关系有关,但我的印象是静态初始值设定项应该始终在构造函数之前运行。
发生这种情况的原因是什么(技术上是在java实现中)?
是否建议一起避免静态初始值设定项?