以下代码,为什么打印结果是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();
}
}
答案 0 :(得分:0)
这是因为静电是按顺序处理的。当您将其更改为:
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 {}
,因为它已经处于处理静态的状态static {}
答案 1 :(得分:0)
JVM首先加载Test类以运行main方法。加载时,它将为测试变量分配内存和默认值(空)。
加载后,初始化程序将以自顶向下的方式运行。
首先,运行test = new Test()
,它调用Test类的默认构造函数,该构造函数包含实例块(System.out.println("A")
)的代码。因此,我们得到A作为输出。
然后,执行打印B的静态块。
此后,main方法开始,再次调用Test的默认构造函数,该函数将打印A。
因此,输出ABA。