java - 使用静态引用创建对象时,为什么实例 block 和默认构造函数先于静态 block 执行?

标签 java static-block

public class TestLab {

    static Test aStatic=new Test();
    public static void main(String[] args) {

        TestLab obj=new TestLab();
    }
    static{
        System.out.println("In static block of TestLab");
          }

}


public class Test {


    static Test ref=new Test();
    Test()
    {
        System.out.println("Default Constructor of Test");
    }
    static
    {
        System.out.println("In Static Block of Test");
    }
    {
         System.out.println("In instance block of Test");
    }

}

通常静态 block 在类加载期间首先执行。执行上述示例时,会收到以下输出:

In instance block of Test

Default Constructor of Test

In Static Block of Test

In instance block of Test

Default Constructor of Test

In static block of TestLab

为什么测试类的实例 block 和默认构造函数先于测试类的静态 block 执行?

最佳答案

好的。 static 字段/ block 在类初始化期间设置/执行。 它们按照它们在代码中出现的顺序执行。 因此,在类 TestLab 被加载后,当它被初始化时,会发生以下事情:

  1. 静态测试 aStatic=new Test(); ==> 作为类 TestLab 初始化的一部分调用。从这里开始,Test 类被引用。因此,控制权移至 Test 类。

  2. static Test ref=new Test(); ==> 即,测试类的第一行(在其初始化阶段)被执行。此行涉及创建一个新的 Test 实例,因此控制权移至 Test 的实例 block (In instance block of Test),然后移至构造函数(测试的默认构造函数)。

  3. 现在 static Test ref=new Test(); 已经完成,所以 Test 的类初始化继续并到达静态 block (在静态测试 block 中)。这完成了 Test 的初始化。

  4. 控制返回到 TestLab,现在 new Test() 被调用。所以再次打印 In instance block of TestDefault Constructor of Test (类已经初始化,所以 static 字段不会再次初始化并且是静态的 block 不被执行)。

  5. 控制到达 TestLab 的静态 block (在 TestLab 的静态 block 中)。

关于java - 使用静态引用创建对象时,为什么实例 block 和默认构造函数先于静态 block 执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32754136/

相关文章:

java - 密集和稀疏运行时间

java - 数组 if 语句并打印数组

java - 在上下文中获取 NullPointerException

tomcat - 如何登录jar库的静态 block

java - 无法初始化类 com.example.testapp.SomeHelper

java - 枚举 - 静态和实例 block

java - TargetDataLine 和 Xuggler 用屏幕视频录制音频

security - Java认证、授权服务(JAAS)