JAVA物件例項化過程
阿新 • • 發佈:2021-07-09
JAVA物件例項化過程
JAVA物件例項化
過程分為兩步:
- 類初始化過程(也可以叫做:類載入過程)
- 物件例項化過程
第一步 類初始化過程(類載入)
當JVM遇到new對應的位元組碼指令時,首先檢查這個指令的引數是否能在常量池中找到一個類的符號引用,並檢查該引用代表的類是否已被虛擬機器載入、解析和初始化。如果沒有則執行相應的類載入過程。
需要三個大的階段:類載入 -> 連線 --> 初始化
- 類載入:通過
雙親委派機制
各個類載入器載入對應的class到方法區
,可以從class檔案、jar包,動態生成的class獲取到類的二進位制流。 - 驗證:校驗class位元組流是否符合當前jvm規範,比如開頭的CAFEBABE。
- 準備:在類載入階段就已經確定了根據這個類所建立物件的記憶體大小,所以在準備階段為即將建立的物件
分配記憶體空間
,並對靜態變數設定初始值
,這樣就保證了即使沒有物件賦值,也能夠正常使用該物件。如果是final修飾的變數,此時直接將宣告值賦值給final變數。 - 解析:將
存放在元空間中的執行時常量池
的符號引用替換為直接引用,與全域性的字串常量池保持一致。 - 初始化:執行位元組碼中的
方法(該方法就是類構造器),首先為 靜態變數
賦值,然後執行靜態程式碼塊
。jvm會保證子類的執行之前,父類的 先執行完畢。( 方法由 靜態變數賦值程式碼
和靜態程式碼塊
組成;先執行類靜態變數顯示賦值程式碼,再到靜態程式碼塊程式碼)
第二步 物件例項化過程
當完成了上述類載入過程後,開始執行在類中所定義的建構函式,進行物件例項化,當例項化完成後,可以直接使用該物件。
-
在執行結束
方法後,已經完成了類的初始化過程。 -
開始在堆空間
設定物件頭
,將物件的所屬類(即類的元資料資訊)、物件的HashCode和物件的GC資訊、鎖資訊等資料存放在物件的物件頭中。 -
開始執行位元組碼中的
方法(該方法就是例項構造器) -
()方法由 非靜態變數、非靜態程式碼塊以及對應的構造器組成 -
()方法可以過載多個,類有幾個構造器就有幾個 ()方法 ()方法中的程式碼執行順序為:父類變數初始化,父類程式碼塊,父類構造器,子類變數初始化,子類程式碼塊,子類構造器。
-
靜態變數,靜態程式碼塊,普通變數,普通程式碼塊,構造器的執行順序:
-
具有父類的子類的例項化順序如下:
當執行完畢
方法後就完成了java物件例項化過程,生成了一個java bean物件,現在就可以使用該物件進行操作了。