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的静态块之前执行?
好.static在类初始化期间设置/执行字段/块.它们按照它们出现在代码中的顺序执行.因此,在TestLab加载类之后,当它被初始化时,会发生以下情况:
static Test aStatic=new Test();==>作为类初始化的一部分调用TestLab.从这里开始,Test引用了类.所以,控制转移到了Test课堂.
static Test ref=new Test();==>即,执行Test类的第一行(在其初始化阶段).这一行涉及创建一个新实例Test,因此控制移动到实例块(在Test的实例块中),Test然后转到构造函数(Default Constructor of Test).
现在static Test ref=new Test();已经完成了,因此,类初始化Test继续并到达静态块(In Static Block of Test).这样就完成了初始化Test.
控制回到TestLab现在,现在new Test()被称为.因此,再次打印测试和默认构造函数的实例块(类已经初始化,因此static字段不会再次初始化,并且不会执行静态块).
控制到达静态块TestLab(在TestLab的静态块中).
| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |