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

时间:2019-09-17 16:00:36

标签: java constructor initialization instance-variables

许多作者在书中写道,类中实例变量的默认值是由class-default构造函数初始化的,但我在理解这一事实方面存在问题。

class A {
    int x;

    A() {}
}

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

1 个答案:

答案 0 :(得分:5)

说明

按照 JLS 中的规定,在执行任何其他分配之前,字段会始终自动初始化为它们的默认值

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

因此,源代码中没有任何内容可以明确地执行此操作。它是在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 = ...之前。如JLS中所述,在创建变量时,它立即默认为0