[英]Java Instance Variable initialized 2 times?
看完這文章我感到困惑的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及其超類中聲明的所有實例變量。 其次 ,虛擬機會將所有實例變量初始化為其默認初始值。 第三 ,虛擬機將在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;
第二步他到底是什么意思?
是。 默認情況下,每個字段都初始化為默認值,例如:
如果您將某個對象定義為字段,則將其初始化為null,如果其int類型則為0,對於布爾值,它將初始化為false,依此類推。
原因是,不確定是否要在構造函數中初始化的字段具有一些初始值。
分配內存后,該內存通常不為空。 它充滿了內存中以前存在的任何內容。 因此,JavaVM在分配內存之后要做的第一件事就是通過覆蓋所有具有默認值的東西來清理它。 大多數類型的“默認默認”值等於0,但是在聲明變量時可以給它一個不同的默認值。 當您的班級看起來像這樣:
class Liquid {
private int mlVolume = 1000;
private float temperature = 21.0f; // in Celsius
JavaVM會將它們初始化為1升和室溫的合理默認值,而不是0體積和凝固點。
作者似乎來自C / C ++背景,在這種背景下不會自動初始化為0,程序員負責確保在使用變量之前將所有變量都設置為已知值,否則它們中可能有任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.