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
被加载后,当它被初始化时,会发生以下事情:
静态测试 aStatic=new Test();
==> 作为类TestLab
初始化的一部分调用。从这里开始,Test
类被引用。因此,控制权移至Test
类。static Test ref=new Test();
==> 即,测试类的第一行(在其初始化阶段)被执行。此行涉及创建一个新的Test
实例,因此控制权移至Test
的实例 block (In instance block of Test),然后移至构造函数(测试的默认构造函数)。现在
static Test ref=new Test();
已经完成,所以Test
的类初始化继续并到达静态 block (在静态测试 block 中)。这完成了Test
的初始化。控制返回到
TestLab
,现在new Test()
被调用。所以再次打印 In instance block of Test 和 Default Constructor of Test (类已经初始化,所以static
字段不会再次初始化并且是静态的 block 不被执行)。控制到达
TestLab
的静态 block (在 TestLab 的静态 block 中)。
关于java - 使用静态引用创建对象时,为什么实例 block 和默认构造函数先于静态 block 执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32754136/