1. 程式人生 > 其它 >JAVA物件例項化過程

JAVA物件例項化過程

JAVA物件例項化過程

JAVA物件例項化過程分為兩步:

  • 類初始化過程(也可以叫做:類載入過程)
  • 物件例項化過程

第一步 類初始化過程(類載入)

當JVM遇到new對應的位元組碼指令時,首先檢查這個指令的引數是否能在常量池中找到一個類的符號引用,並檢查該引用代表的類是否已被虛擬機器載入、解析和初始化。如果沒有則執行相應的類載入過程。

需要三個大的階段:類載入 -> 連線 --> 初始化

  • 類載入:通過雙親委派機制各個類載入器載入對應的class到方法區,可以從class檔案、jar包,動態生成的class獲取到類的二進位制流。
  • 驗證:校驗class位元組流是否符合當前jvm規範,比如開頭的CAFEBABE。
  • 準備:在類載入階段就已經確定了根據這個類所建立物件的記憶體大小,所以在準備階段為即將建立的物件分配記憶體空間,並對靜態變數設定初始值這樣就保證了即使沒有物件賦值,也能夠正常使用該物件。如果是final修飾的變數,此時直接將宣告值賦值給final變數。
  • 解析:存放在元空間中的執行時常量池的符號引用替換為直接引用,與全域性的字串常量池保持一致。
  • 初始化:執行位元組碼中的方法(該方法就是類構造器),首先為靜態變數賦值,然後執行靜態程式碼塊。jvm會保證子類的執行之前,父類的先執行完畢。(方法由 靜態變數賦值程式碼靜態程式碼塊 組成;先執行類靜態變數顯示賦值程式碼,再到靜態程式碼塊程式碼)

第二步 物件例項化過程

當完成了上述類載入過程後,開始執行在類中所定義的建構函式,進行物件例項化,當例項化完成後,可以直接使用該物件。

  • 在執行結束方法後,已經完成了類的初始化過程。

  • 開始在堆空間設定物件頭,將物件的所屬類(即類的元資料資訊)、物件的HashCode和物件的GC資訊、鎖資訊等資料存放在物件的物件頭中。

  • 開始執行位元組碼中的方法(該方法就是例項構造器)

  • ()方法由 非靜態變數、非靜態程式碼塊以及對應的構造器組成

    • ()方法可以過載多個,類有幾個構造器就有幾個()方法
    • ()方法中的程式碼執行順序為:父類變數初始化,父類程式碼塊,父類構造器,子類變數初始化,子類程式碼塊,子類構造器。
  • 靜態變數,靜態程式碼塊,普通變數,普通程式碼塊,構造器的執行順序:

  • 具有父類的子類的例項化順序如下:

當執行完畢方法後就完成了java物件例項化過程,生成了一個java bean物件,現在就可以使用該物件進行操作了。