默认构造函数如何初始化字段



正如许多作者在他们的书中写道,类中实例变量的默认值由类默认构造函数初始化,但我在理解这一事实时遇到了问题。

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 中所述。

相关内容

  • 没有找到相关文章

最新更新