Java中的類載入機制(暫時)
阿新 • • 發佈:2019-08-28
1.載入 2.驗證,3.準備,4.解析(這三個階段稱之為連線,連線階段負責把類的二進位制資料合併到JRE中) 5.初始化
載入:載入階段是類載入過程的第一個階段。在這個階段,JVM 的主要目的是將位元組碼(.class檔案)從各個位置(網路、磁碟等)轉化為二進位制位元組流載入到記憶體中,接著會為這個類在 JVM 的方法區建立一個對應的 Class 物件,這個 Class 物件就是這個類各種資料的訪問入口。(通俗點說:把程式碼資料載入到記憶體中)
驗證:確保載入的類資訊(.class)符合JVM規範,無安全方面的問題。
準備:為類的靜態域(static修飾的,主要就是類成員變數)分配記憶體,並設定初始值。
(Java 中的變數有「類變數」和「類成員變數」兩種型別,「類變數」指的是被 static 修飾的變數,而其他所有型別的變數都屬於「類成員變數」。在準備階段,JVM 只會為「類變數」分配記憶體,而不會為「類成員變數」分配記憶體。「類成員變數」的記憶體分配需要等到初始化階段才開始。)
解析:將類的二進位制資料中的符號引用替換成其在記憶體中的直接引用。(瞭解下就行)
初始化(重點):該階段主要是對靜態Field進行初始化
在Java類中對靜態Field指定初始值有兩種方式:
-
宣告時即指定初始值,如static int a = 5;
-
使用靜態程式碼塊為靜態Field指定初始值,如:static{ b = 5; }
初始化類的步驟:
- 假如這個類還沒有被載入和連線,則程式先載入並連線該類。
- 假如該類的直接父類還沒有被初始化,則先初始化其直接父類。
- 假如類中有初始化語句,則系統依次執行這些初始化語句。(所以JVM總是最先初始化java.lang.Object類。)
類初始化的時機(什麼時候初始化類)
1.建立類的例項時(new物件)
2.初始化某個類的子類時,此時該子類的所有父類都會被初始化
3.呼叫某個類的靜態方法時
4.使用某個類或介面的靜態域或對該域賦值時
(還有兩個,不常見就不寫了)