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

时间:2015-03-20 14:05:26

标签: java initialization

阅读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;
    }
     

使用new运算符实例化新的Coffee对象时,   Java虚拟机第一个将分配(至少)足够的空间   堆来保存在Coffee及其中声明的所有实例变量   超。 第二,虚拟机将初始化所有   实例变量为其默认初始值。 第三,虚拟   machine将调用Coffee类中的(init)/ super构造函数方法。

它表示第二步将所有实例变量初始化为其默认值。在这种情况下,首先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;

第二步他到底意味着什么?

2 个答案:

答案 0 :(得分:1)

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

如果你将某个对象定义为一个字段,那么它将被初始化为null,而如果它的int类型为0,对于boolean,它将初始化为false,依此类推。

原因是,它不确定你是否会在你要在构造函数中初始化的字段中获得一些初始值。

答案 1 :(得分:1)

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

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

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

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