默认构造函数如何初始化字段
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
。
正如许多作者在他们的书中所写的那样,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
。