这个问题在这里已有答案:
以下代码,为什么打印结果是ABA。在我看来,JVM首先会加载静态块语句,然后加载其他语句,因此B将首先打印。
public class Test{
public static Test test = new Test();
{
System.out.println("A");
}
static {
System.out.println("B");
}
public static void main(String[] args) {
Test test = new Test();
}
}
这是因为静态按顺序处理。当您将其更改为:
class Test {
static {
System.out.println("B");
}
public static Test test = new Test();
{
System.out.println("A");
}
public static void main(String[] args) {
Test test = new Test();
}
}
你会得到BAA。
JVM只会为每个类初始化一次静态(如果我没有弄错的话,每个ClassLoader),就像我按顺序说的那样。它看起来像这样:
public static Test test = new Test();
static {}
JVM首先加载类Test以运行main方法。在加载时,它会为测试变量分配内存和默认值(null)。
加载后,初始化器以自上而下的方式运行。
首先,运行static {}
,它调用Test类的默认构造函数,其中包含实例块(test = new Test()
)的代码。因此,我们得到A作为输出。
然后,执行打印B的静态块。
之后,main方法启动,再次调用Test的默认构造函数,打印A.
因此,输出ABA。