Java 实例变量初始化了 2 次?

Java Instance Variable initialized 2 times?

阅读 this 文章后,我对 JVM 的第二步感到困惑。

class Liquid {
    private int mlVolume;
    private float temperature; // in Celsius
    Liquid(int mlVolume, float temperature) {
        this.mlVolume = mlVolume;
        this.temperature = temperature;
    }
    //...
}
// In source packet in file init/ex18/Coffee.java
class Coffee extends Liquid {
    private boolean swirling;
    private boolean clockwise;
    public Coffee(int mlVolume, float temperature,
        boolean swirling, boolean clockwise) {
        super(mlVolume, temperature);
        this.swirling = swirling;
        this.clockwise = clockwise;
    }

When you instantiate a new Coffee object with the new operator, the Java virtual machine first will allocate (at least) enough space on the heap to hold all the instance variables declared in Coffee and its superclasses. Second, the virtual machine will initialize all the instance variables to their default initial values. Third, the virtual machine will invoke the (init)/super constructor method in the Coffee class.

它说第二步将所有实例变量初始化为其默认值。在这种情况下,首先 JVM 执行此操作 ?

液体

this.mlVolume = 0;
this.temperature = 0

咖啡

this.swirling = 0;
this.clockwise = 0;

并且只有在调用 Liquid(int, float) 之后它才会这样做:

液体

this.mlVolume = mlVolume;
this.temperature = temperature;

咖啡

this.swirling = swirling;
this.clockwise = clockwise;

他说的第二步到底是什么意思?

是的。默认情况下,每个字段都初始化为默认值,如:

如果您将某个对象定义为一个字段,那么它将被初始化为 null,如果它是 int 类型则为 0,对于 boolean,它将初始化为 false 等等。

这样做的原因是,不确定您将要在构造函数中初始化的字段是否具有一些初始值。

分配内存时,该内存通常不是空的。它充满了以前记忆中的任何东西。因此,JavaVM 在分配内存后做的第一件事就是通过用默认值覆盖所有内容来清理它。大多数类型的 "default default" 值等同于 0,但您可以在声明变量时为其指定不同的默认值。当您的 class 看起来像这样时:

class Liquid {
    private int mlVolume = 1000;
    private float temperature = 21.0f; // in Celsius

JavaVM 会将它们初始化为合理的默认值 1 升和室温,而不是 0 体积和冰点。

作者似乎来自 C/C++ 背景,其中初始化为 0 不会自动发生,程序员有责任确保所有变量在使用前都设置为已知值,否则它们里面可能有任何东西。