关于JVM加载类与静态块和非静态块[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

以下代码,为什么打印结果是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();
    }    

}
java jvm
2个回答
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),就像我按顺序说的那样。它看起来像这样:

  1. 新测试()
  2. 检测到Test未初始化
  3. 按顺序初始化静态变量
  4. 先拿起来:public static Test test = new Test();
  5. 在启动测试后,它将触发初始化块(println(“A”))。它不会触发qazxsw poi,因为它已经处于处理静态的状态
  6. 一旦创建并分配了测试,它就可以获取下一个块
  7. 处理static {}

0
投票

JVM首先加载类Test以运行main方法。在加载时,它会为测试变量分配内存和默认值(null)。

加载后,初始化器以自上而下的方式运行。

首先,运行static {},它调用Test类的默认构造函数,其中包含实例块(test = new Test())的代码。因此,我们得到A作为输出。

然后,执行打印B的静态块。

之后,main方法启动,再次调用Test的默认构造函数,打印A.

因此,输出ABA。

© www.soinside.com 2019 - 2024. All rights reserved.