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