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

pys*_*kmr 3 java constructor initialization instance-variables

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

class A {
    int x;

    A() {}
}
Run Code Online (Sandbox Code Playgroud)

正如我提供的A类的默认构造函数一样,现在x的值如何初始化为0?

Zab*_*uza 5

说明

就像在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;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

Before: 0
After: 1
Run Code Online (Sandbox Code Playgroud)

因此,它x已经是0,第一个任务之前x = ...0如JLS中所述,它立即默认为创建变量时使用。