1. 程式人生 > >Class載入機制

Class載入機制

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執行時常量會初始化該類