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

How are fields initialized by the default constructor

正如许多作者在他们的书中所写的那样,class 中的实例变量的默认值是由 class-默认构造函数初始化的,但我对这个事实的理解有问题.

class A {
    int x;

    A() {}
}

我已经提供了classA的默认构造函数,那么x的值如何初始化为0呢?

说明

JLS 中所写,字段总是 自动初始化为它们的默认值 ,在任何其他作业之前。

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

所以源代码中没有任何内容明确地这样做。它是在 JVM 中实现的,它必须遵守 JLS 以表示 Java 的有效实现(有不止一个 Java 实现)。

§4.12.5:

Initial Values of Variables

Each class variable, instance variable, or array component is initialized with a default value when it is created (§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 在第一个赋值 x = ... 之前已经 0。如 JLS 中所述,它在变量创建时立即默认为 0