1. 程式人生 > 其它 >13. .class檔案載入機制

13. .class檔案載入機制

class A {
    static {
        System.out.print("1");
    }

    public A() {
        System.out.print("2");
    }
}

class B extends A {
    static {
        System.out.print("a");
    }

    public B() {
        System.out.print("b");
    }
}

public class Hello {
    public static void main(String[] args) {
        A ab = new B();
        ab = new B();
    }
}

首先看題目 有AB兩個子父類 ,每個類中都有一個靜態塊與構造例項

然後拆解main方法中的程式碼塊

A ab = new B();
// 上面這行程式碼 其實就是例項化了一個B物件
// Java程式碼遵循兩個原則,也是我們.class檔案的載入機制
// 1. 【靜態塊在類載入前執行 靜態塊一定優先於所有例項】
// 2. 【子類物件在例項化時 會優先呼叫父類】

// 所以靜態塊中的1,a優先執行 而且父類中的1優於a   ==》1,a
// 然後按照父類優先原則 2優於b   ==》1,a,2,b

ab = new B();
// 又建立了一個B物件的例項
// 這個時候按順序執行還是:1,a,2,b
// 但是【靜態塊中的內容只加載一次】,所以說1,a不再執行

// 最終結果1,a,2,b,2,b