我有 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实现中)?
是否建议一起避免使用静态初始化程序?