许多作者在书中写道,类中实例变量的默认值是由class-default构造函数初始化的,但我在理解这一事实方面存在问题。
class A {
int x;
A() {}
}
我已经提供了类A的默认构造函数,现在x的值如何初始化为0?
答案 0 :(得分:5)
按照 JLS 中的规定,在执行任何其他分配之前,字段会始终自动初始化为它们的默认值。
int
的默认值为0
。因此,根据定义,这实际上是Java标准的一部分。称之为魔术,它与构造函数中编写的内容或其他内容无关。
因此,源代码中没有任何内容可以明确地执行此操作。它是在JVM中实现的,必须遵守JLS才能表示有效的Java实现(不止一个Java实现)。
请参见§4.12.5:
变量的初始值
您甚至可以观察到这种情况发生在任何分配之前。看下面的例子:
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 = ...
之前。如JLS中所述,在创建变量时,它立即默认为0
。