pys*_*kmr 3 java constructor initialization instance-variables
正如许多作者在书中所写的那样,类中实例变量的默认值是由class-default构造函数初始化的,但我在理解这一事实时遇到了问题。
class A {
int x;
A() {}
}
Run Code Online (Sandbox Code Playgroud)
正如我提供的A类的默认构造函数一样,现在x的值如何初始化为0?
就像在JLS中所写的那样,在进行任何其他分配之前,字段始终会自动初始化为其默认值。
的默认int值为0。因此,根据定义,这实际上是Java标准的一部分。称之为魔术,它与构造函数中编写的内容或其他内容无关。
因此,源代码中没有任何内容可以明确地执行此操作。它是在JVM中实现的,该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;
}
Run Code Online (Sandbox Code Playgroud)
哪个输出
Before: 0
After: 1
Run Code Online (Sandbox Code Playgroud)
因此,它x已经是0,第一个任务之前x = ...。0如JLS中所述,它立即默认为创建变量时使用。