我想知道静态变量的默认初始化是在静态初始化之前还是与它一起进行?
让我们看看下面的代码:
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中知道默认初始化发生在静态初始化之前?
发布于 2018-03-28 20:22:28
你是正确的。
静态字段和初始化器确实按照声明的顺序执行:
12.4.2. Detailed Initialization Procedure 接下来,按照文本顺序执行类的类变量初始化器和静态初始化器,或接口的字段初始化器,就像它们是单个块一样。
在运行时,每个类变量实际上都是用默认值初始化的:
4.12.5. Initial Values of Variables ..。 每个类变量、实例变量或数组组件在创建时都会使用默认值初始化(§15.9,§15.10): 对于类型字节,默认值为零,即(字节)0的值。 对于类型短,默认值为零,即( 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
}https://stackoverflow.com/questions/49543368
复制相似问题