java物件建立過程及初始化順序
Java虛擬機器建立一個物件都包含以下步驟:
(1)給物件分配記憶體。
(2)將物件的例項變數自動初始化為其變數型別的預設值。
(3)初始化物件,給例項變數賦予正確的初始值。
對於以上第三個步驟,Java虛擬機器可採用3種方式來初始化物件,到底採用何種初始化方式取決於建立物件的方式。
(1)如果物件是通過clone()方法建立的,那麼Java虛擬機器把原來被克隆物件的例項變數的值拷貝到新物件中。
(2)如果物件是通過ObjectInputStream類的readObject()方法建立的,那麼Java虛擬機器通過從輸入流中讀入的序列化資料來初始化那些非暫時性(non-transient)的例項變數。
(3)在其他情況下,如果例項變數在宣告時被顯式初始化,那麼就把初始化值賦給例項變數,接著再執行構造方法。這是最常見的初始化物件的方式。
初始化的順序是:先靜態物件(如果它們尚未因前面的物件建立過程而被初始化),而後是非靜態物件。在類的內部,變數定義的先後順序決定了初始化的順序,即使變數定義散佈於方法定義之間,它們仍舊會在任何方法(包括構造器)被呼叫之前得到初始化。
總結物件建立的過程:
(1)首次建立物件時,類中的靜態方法/靜態欄位首次被訪問時,java直譯器必須先查詢類路徑,以定位.class檔案;
(2)然後載入.class(這將建立一個class物件),有關靜態初始化的所有動作都會執行。因此,靜態初始化只在Class物件首次載入的時候進行一次;
(3)當用new XX()建立物件時,首先在堆上為物件分配足夠的儲存空間;
(4)這塊儲存空間會被清0,這就自動地將物件中的所有基本型別資料都設定成了預設值(對數字來說就是0,對布林型和字元型也相同),而引用則被設定成了null;
(5)執行所有出現於欄位定義處的初始化動作(非靜態物件的初始化);
(6)執行構造器。
1、 物件的初始化
(1) 非靜態物件的初始化
在建立物件時,物件所在類的所有資料成員會首先進行初始化。基本型別:int型,初始化為0。如果為物件:這些物件會按順序初始化。
※在所有類成員初始化完成之後,才呼叫本類的構造方法建立物件。構造方法的作用就是初始化。
(2) 靜態物件的初始化
程式中主類的靜態變數會在main方法執行前初始化。不僅第一次建立物件時,類中的所有靜態變數都初始化,並且第一次訪問某類(注意此時未建立此類物件)的靜態物件時,所有的靜態變數也要按它們在類中的順序初始化。
2、 繼承時,物件的初始化過程
(1) 主類的超類由高到低按順序初始化靜態成員,無論靜態成員是否為private。
(2) 主類靜態成員的初始化。
(3) 主類的超類由高到低進行預設構造方法的呼叫。注意,在呼叫每一個超類的預設構造方法前,先進行對此超類進行非靜態成員的初始化。
(4) 主類非靜態成員的初始化。
(5) 呼叫主類的構造方法。