当我运行以下代码时:
public class Test {
Test(){
System.out.println("1");
}
{
System.out.println("2");
}
static {
System.out.println("3");
}
public static void main(String args[]) {
new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望按此顺序获得输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
但我得到的是相反的顺序:
3
2
1
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么它以相反的顺序输出?
================
另外,当我创建多个实例时Test:
new Test();
new Test();
new Test();
new Test();
Run Code Online (Sandbox Code Playgroud)
静态块仅在第一次执行.
Ósc*_*pez 62
这一切都取决于初始化语句的执行顺序.您的测试表明此订单是:
编辑
感谢您的评论,现在我可以引用JVM规范中的相应部分.这是详细的初始化过程.
小智 5
Test(){System.out.println("1");}
{System.out.println("2");}
static{System.out.println("3");}
Run Code Online (Sandbox Code Playgroud)
静态事物首先被执行, {System.out.println("2");}不是函数的一部分,因为它的范围首先被调用,并且 Test(){System.out.println("1");}被称为last,因为其他两个被称为first
首先,将类加载到JVM中并进行类初始化.在此步骤中,执行静态块."{...}"只是"static {...}"的句法等价物.由于代码中已经存在"静态{...}"块,因此将附加"{...}".这就是为什么你在2之前打印3.
下一次加载类后,java.exe(我假设您从命令行执行)将找到并运行main方法.main静态方法初始化其构造函数被调用的实例,因此最后打印"1".
| 归档时间: |
|
| 查看次数: |
2251 次 |
| 最近记录: |