Java - 静态初始化之前的静态变量的默认初始化

时间:2018-03-28 20:12:33

标签: java

我想知道静态变量的默认初始化是在静态初始化之前发生还是与它一起发生?

让我们看看下面的代码:

class Test {

    static {
        System.out.println(Test.a);  // prints 0
        a = 99; // a get 99
        System.out.println(Test.a); // prints 99
    }

    static int a = 10;

    static {
        System.out.println(a); // prints 10
    }

    public static void main(String[] args) {

    }
}

我的猜测是,当加载类时,所有的静态变量都是在内存中创建的,然后只给它们提供默认值。然后静态初始化发生在代码中出现的静态初始化器和静态字段的顺序中。我是对的吗?

编辑:我知道静态初始化的顺序但是我无法在JLS中得到它告诉我们在静态初始化发生之前发生默认初始化的问题?

1 个答案:

答案 0 :(得分:3)

你是对的。

静态字段和初始化程序确实按其声明的顺序执行:

  

12.4.2. Detailed Initialization Procedure

     

接下来,执行类变量初始值设定项和静态   类的初始值设定项,或接口的字段初始值设定项,   按照文字顺序,好像它们只是一个块。

在运行时,每个类变量确实用默认值初始化:

  

4.12.5. Initial Values of Variables

     

...

     

每个类变量,实例变量或数组组件都是   在创建时使用默认值初始化(§15.9,§15.10):

     

对于type byte,默认值为零,即值   (字节)0

     

对于type short,默认值为零,即值   (短)0

     

对于int类型,默认值为零,即0。   ...

这就是实际行为的原因:

static {
    System.out.println(Test.a);  // prints 0 -> default value for `int`
    a = 99; // a get 99
    System.out.println(Test.a); // prints 99 -> value after previous statement executed
}