首页 > 解决方案 > java中的初始化顺序,静态块内的构造函数

问题描述

考虑到标准的 java 初始化顺序规则,我不清楚为什么下面的代码

public class Foo {

    static { new Foo(); }

    static{ System.out.println("static code"); }

    { System.out.println("non static code"); }

    public Foo() { System.out.println("constructor"); }

    public static void main(String[] args) {}
}

输出这个:

non static code
constructor
static code

标签: javaconstructorstaticinitialization

解决方案


JLS 说

  • 初始化类时,静态块和静态变量初始化将按程序源代码顺序执行。

  • 实例初始化时,实例块和实例变量初始化将按程序源代码顺序执行。这发生超级实例初始化之后和构造函数主体执行之前。

在您的示例中,第一个静态创建了Foo. 这会导致在Foo执行第一个静态块时执行实例块。所以,顺序是:

  1. 类已加载
  2. Foo触发静态初始化
  3. 执行第一个静态块,它执行new Foo().
    1. 执行实例块 - 打印“非静态代码”
    2. 构造函数被执行 - 打印“构造函数”
  4. 第一个静态块完成。
  5. 第二个静态块被执行——打印“静态代码”。
  6. 主要方法被调用。

推荐阅读