当我运行此代码时,它输出blockA blockB blockA

我希望输出是blockB blockA blockA

为什么输出blockA blockB blockA,而不是blockB blockA blockA

public class Test
{
    public static Test t1 = new Test();
    {
        System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
}

最佳答案

在课堂上,您首先添加了以下语句。

public static Test t1 = new Test();


因此它将是执行类的初始值设定项

{
        System.out.println("blockA");
}


因此,将打印blockA。

然后执行静态初始化程序

   static
    {
        System.out.println("blockB");
    }


并打印出blockB

最后执行主函数中的代码

 Test t2 = new Test();


这将再次触发类初始化器

{
        System.out.println("blockA");
}


因此再次打印blockA。

关于类和静态初始化程序的执行顺序的详细说明在此处jls-12.4.2

关于java - 意外的Java文本输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46024762/

10-09 12:50