參考資料: Java類載入過程及static詳解

 

image

java源代碼編寫 > 編譯 > class文件 > JVM字節碼 > 進JVM運行

編譯:

  1. 詞法分析: 將源代碼轉換為”token”

  2. 語法分析: 將token排成樹狀結構,分析其中的語法構造是否正確,此階段還無法判斷出句子是否有意義

  3. 語意分析: 分析句子是否有意義,例如除數不能為0


 

進入JVM運行 > 載入 > 連結 > 初始化

靜態加載順序

載入:將類載入記憶體,為了確保程序執行穩定,會先委託父類加載器執行,若是遞迴往上找不到父類時,才會由子類自行加載

連結:

  • 檢查: 根據JVM要求,檢查.class檔有無錯誤

  • 準備: 準備要執行的類,將此類中有靜態修飾詞的變數進行記憶體分配並給予預設值

    特別有final修飾詞的在此階段會進行賦值

    在此階段中,會將賦好預設值的靜態變數與代碼塊放置<clinit>的特殊方法中,

  • 解析: 將常量池中的符號引用轉為直接引用(只有靜態會被解析)

    例如 獲取方法&欄位的地址直,以便直接呼叫

初始化

static的初始化

靜態項目被一一執行(由父類>子類)

變數:賦值上使用者設定的值,取代原來的預設值

代碼塊:根據順序執行

在此階段中,執行<clinit>特殊方法,用使用者的值取代預設值

<clinit>不會確認父類的<clinit>是否已執行,這部分由JVM來確保

 

 

<clinit>()是初始化階段,執行的靜態構造器方法

<linit>() 與上面的差別在於,這是執行非靜態的構造方法,只有創建物件實體(呼叫建構子時),才會執行

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Lillian 的頭像
    Lillian

    安安的code日記

    Lillian 發表在 痞客邦 留言(0) 人氣()