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中编写的内容。所以从源代码的角度来看,这是一个纯粹的魔法