当使用静态引用创建对象时,为什么在静态块之前执行实例块和默认构造函数?

Ari*_*pta 6 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

通常,在类加载期间首先执行静态块.执行上面的示例时,会收到以下输出:

在测试的实例块中

默认的测试构造函数

在静态测试块中

在测试的实例块中

默认的测试构造函数

在TestLab的静态块中

为什么Test类的实例块和Default Constructor在Test Class的静态块之前执行?

The*_*ind 7

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

  1. static Test aStatic=new Test();==>作为类初始化的一部分调用TestLab.从这里开始,Test引用了类.所以,控制转移到了Test课堂.

  2. static Test ref=new Test();==>即,执行Test类的第一行(在其初始化阶段).这一行涉及创建一个新实例Test,因此控制移动到实例块(在Test的实例块中),Test然后转到构造函数(Default Constructor of Test).

  3. 现在static Test ref=new Test();已经完成了,因此,类初始化Test继续并到达静态块(In Static Block of Test).这样就完成了初始化Test.

  4. 控制回到TestLab现在,现在new Test()被称为.因此,再次打印测试默认构造函数的实例块(类已经初始化,因此static字段不会再次初始化,并且不会执行静态块).

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