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

Java 默认构造函数如何初始化字段,java,constructor,initialization,instance-variables,Java,Constructor,Initialization,Instance Variables,正如许多作者在他们的书中所写的那样,类内实例变量的默认值是由类默认构造函数初始化的,但我在理解这一事实时遇到了一个问题 class A { int x; A() {} } 由于我已经提供了类A的默认构造函数,现在如何将x的值初始化为0?解释 如JLS中所述,在任何其他赋值之前,字段总是自动初始化为其默认值 int的默认值为0。根据定义,这实际上是Java标准的一部分。称之为魔法,它与构造函数中编写的内容或任何内容无关 因此,在源代码中没有任何东西可以明确地做到这一点。它是在J

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

class A {
    int x;

    A() {}
}
由于我已经提供了类A的默认构造函数,现在如何将x的值初始化为0?

解释 如JLS中所述,在任何其他赋值之前,字段总是自动初始化为其默认值

int
的默认值为
0
。根据定义,这实际上是Java标准的一部分。称之为魔法,它与构造函数中编写的内容或任何内容无关

因此,在源代码中没有任何东西可以明确地做到这一点。它是在JVM中实现的,JVM必须遵循JLS才能表示有效的Java实现(不止一个Java实现)

见:

变量的初始值

每个类变量、实例变量或数组组件在创建时都使用一个默认值初始化(,)


注 你甚至可以观察到这种情况发生在任何作业之前。请看以下示例:

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
。在创建变量时,它会立即默认为
0
,如JLS中所述。

“它与构造函数无关。”我对此感到困惑。它与构造函数直接相关,因为它们触发了“默认值初始化”,这是一个很好的答案,但是你提到的“魔法”可能是OP想要知道的。好吧,源代码中没有这样做的东西。它实际上是在解释和执行源代码的JVM中实现的。Java的每个实现(不止一个)都需要遵循JLS中编写的内容。所以从源代码的角度来看,这是一个纯粹的魔法