Class載入機制
阿新 • • 發佈:2019-01-02
1. 一個class檔案載入的流程
1.1 載入:查詢並載入類的二進位制資料 , 將class檔案載入到記憶體
1.2 連線
– 準備:為類的靜態變數分配記憶體,並將其初始化為預設值
– 解析:把類中的符號引用轉換為直接引用
1.3 初始化:為類的靜態變數賦予正確的初始值
2. class物件、靜態變數、靜態方法 ,儲存在方法區,為所有執行緒共享
3. 一個類如果擁有父類,這個類初始化的時候需要先初始化其父類, 而父類的呼叫不會初始化子類
public class TestParent { public static void main(String[] args) { new C(); new D(); } } class P1 { static { System.out.println( " p static "); } } class C extends P1 { static { System.out.println(" c static "); } } class D extends P1 { static { System.out.println(" D static "); } }
輸出 :
p static
c static
D static
先初始化C的父類P,然後再初始化C,初始化D的時候,由於其父類已經被初始化,所以不再初始化其父類,直接初始化D
4. 呼叫一個類中的靜態變數時,會初始化該類, 呼叫靜態常量時, 如果常量可以在編譯時確定,不會初始化該類,如果需要在執行時確定,則需要初始化該類
public class TestStaticFinal { public static void main(String[] args) { int a = C.x; int b = D.x; int c = E.x; } } class C { //靜態變數 static int x = 2; static { System.out.println(" C static "); } } class D { //靜態常量, 編譯時可確定常量的值 static final int x = 3 + 2; static { System.out.println(" D static "); } } class E { //靜態常量, 執行時才能確定其值的大小 static final int x = new Random().nextInt(10); static { System.out.println(" E static "); } }
輸出結果
C static
E static
結果顯示: C型別靜態變數會初始化, D編譯時常量不會載入初始化, E執行時常量會初始化該類