1. 程式人生 > >Java中的類載入機制(暫時)

Java中的類載入機制(暫時)

1.載入  2.驗證,3.準備,4.解析(這三個階段稱之為連線,連線階段負責把類的二進位制資料合併到JRE中) 5.初始化

載入:載入階段是類載入過程的第一個階段。在這個階段,JVM 的主要目的是將位元組碼(.class檔案)從各個位置(網路、磁碟等)轉化為二進位制位元組流載入到記憶體中,接著會為這個類在 JVM 的方法區建立一個對應的 Class 物件,這個 Class 物件就是這個類各種資料的訪問入口。(通俗點說:把程式碼資料載入到記憶體中

驗證:確保載入的類資訊(.class)符合JVM規範,無安全方面的問題。

準備:為類的靜態域(static修飾的,主要就是類成員變數)分配記憶體,並設定初始值。

(Java 中的變數有「類變數」和「類成員變數」兩種型別,「類變數」指的是被 static 修飾的變數,而其他所有型別的變數都屬於「類成員變數」。在準備階段,JVM 只會為「類變數」分配記憶體,而不會為「類成員變數」分配記憶體。「類成員變數」的記憶體分配需要等到初始化階段才開始。)

解析:將類的二進位制資料中的符號引用替換成其在記憶體中的直接引用。(瞭解下就行)

初始化(重點):該階段主要是對靜態Field進行初始化      

在Java類中對靜態Field指定初始值有兩種方式:

  1. 宣告時即指定初始值,如static int a = 5;

  2. 使用靜態程式碼塊為靜態Field指定初始值,如:static{    b = 5;    } 

初始化類的步驟:

  1. 假如這個類還沒有被載入和連線,則程式先載入並連線該類。
  2. 假如該類的直接父類還沒有被初始化,則先初始化其直接父類。
  3. 假如類中有初始化語句,則系統依次執行這些初始化語句。(所以JVM總是最先初始化java.lang.Object類。)

類初始化的時機(什麼時候初始化類)

1.建立類的例項時(new物件)

2.初始化某個類的子類時,此時該子類的所有父類都會被初始化

3.呼叫某個類的靜態方法時

4.使用某個類或介面的靜態域或對該域賦值時

(還有兩個,不常見就不寫了)