正如许多作者在他们的书中写道,类中实例变量的默认值由类默认构造函数初始化,但我在理解这一事实时遇到了问题。
class A {
int x;
A() {}
}
由于我提供了类 A 的默认构造函数,现在 x 的值如何初始化为 0?
解释
正如JLS中所写,在任何其他分配之前,字段始终自动初始化为其默认值。
int
的默认值为0
。因此,根据定义,这实际上是Java标准的一部分。称之为魔术,它与构造函数中写的内容或任何东西无关。
因此,源代码中没有任何内容明确执行此操作。它是在JVM中实现的,JVM必须遵守JLS才能表示Java的有效实现(不止一个Java实现(。
参见 §4.12.5:
变量的初始值
每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化 (§15.9、§15.10.2(
注意
您甚至可以观察到这发生在任何作业之前。请看以下示例:
public static void main(String[] args) {
System.out.println("After: " + x);
}
private static final int x = assign();
private static int assign() {
// Access the value before first assignment
System.out.println("Before: " + x);
return x + 1;
}
哪些输出
Before: 0
After: 1
所以它x
已经0
,在第一次分配x = ...
之前。它在创建变量时立即默认为0
,如 JLS 中所述。