1. 使用new新建對(duì)象時(shí),初始化順序?yàn)椋红o態(tài)變量>成員變量>構(gòu)造方法。 靜態(tài)初始化塊以靜態(tài)變量對(duì)待
2. 建立類的Class對(duì)象,但沒有執(zhí)行new時(shí)(如訪問任何靜態(tài)變量、或者調(diào)用靜態(tài)方法、或者調(diào)用Class.forName方法等。使用Class<A> a = A.class則不會(huì)觸發(fā))都會(huì)進(jìn)行靜態(tài)變量的初始化。此時(shí)成員變量、構(gòu)造方法未初始化。靜態(tài)變量只會(huì)被初始化一次。 3. 同種變量的初始化,按照代碼中的書寫順序進(jìn)行,無論變量聲明在類頭、方法之間、類尾。 4. 執(zhí)行構(gòu)造方法時(shí),從祖先至子孫依次進(jìn)行。“創(chuàng)建過程是由基類'向外'擴(kuò)散的”。那么如果new一個(gè)子類對(duì)象,子類構(gòu)造方法中的代碼應(yīng)在父類靜態(tài)變量>父類成員變量>父類構(gòu)造方法>子類靜態(tài)變量>子類成員變量之后執(zhí)行。 另附think in java 中對(duì)于對(duì)象創(chuàng)建過程的描述。有助于深入了解:(摘自think in java第三版,機(jī)工,第四章) 假設(shè)有個(gè)名為Dog的類: 1. 當(dāng)首次創(chuàng)建類型為Dog的對(duì)象時(shí)(構(gòu)造器可以看成靜態(tài)方法),或者Dog類的靜態(tài)方法/靜態(tài)域首次被訪問時(shí),Java解釋器必須查找類路徑,以定位Dog.class文件。 2. 然后載入Dog.class(這將創(chuàng)建一個(gè)Class對(duì)象), 有關(guān)靜態(tài)初始化的動(dòng)作都會(huì)執(zhí)行。因此,靜態(tài)初始化只在Class對(duì)象首次加載的時(shí)候執(zhí)行一次。 3. 當(dāng)你用new Dog()創(chuàng)建對(duì)象的時(shí)候,首先在堆上為Dog對(duì)象分配足夠高的存儲(chǔ)空間。 4. 這塊存儲(chǔ)空間會(huì)被清零,這就自動(dòng)的將Dog中的所有基本類型數(shù)據(jù)設(shè)置成了默認(rèn)值(對(duì)于數(shù)字來說就是0,對(duì)布爾型和字符型也相同),而引用則被設(shè)置成了null。 5. 執(zhí)行所有出現(xiàn)于域定義處的初始化動(dòng)作。 6. 執(zhí)行構(gòu)造器。 |
|