13. .class檔案載入機制
阿新 • • 發佈:2021-10-14
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