在Java中使用大括号的奇怪行为

2022-09-01 02:47:19

当我运行以下代码时:

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();
  }
}

我希望按以下顺序获取输出:

1
2
3

但我得到的是相反的顺序:

3
2
1

谁能解释为什么它以相反的顺序输出?

================

另外,当我创建多个实例时:Test

new Test();
new Test();
new Test();
new Test();

静态块仅在第一时间执行。


答案 1

这完全取决于初始化语句的执行顺序。您的测试表明,此顺序为:

  1. 静态初始化块
  2. 实例初始化块
  3. 构造 函数

编辑

感谢您的评论,现在我可以引用JVM规范中的相应部分。这里是详细的初始化过程。


答案 2

3 - 是一个静态初始值设定项,它在加载类时运行一次,首先发生。

2 - 是一个初始值设定项块,java编译器实际上会将其复制到每个构造函数中,因此您可以根据需要在构造函数之间共享一些初始化。很少使用。

1 - 将在构造对象时执行,在 (3) 和 (2) 之后。

更多信息请点击这里


推荐