以前面試總會碰到涉及到類的執行過程的筆試題。下面記錄我自己的測試結果:
public class ClassA { public static ClassA classa = new ClassA(); static{ System.out.println("ClassA的靜態代碼塊"); } public ClassA(){ System.out.println("ClassA的構造方法"); } { System.out.println("ClassA的構造代碼塊"); } }
public class ClassB extends ClassA{ static{ System.out.println("ClassB的靜態代碼塊"); } public ClassB(){ System.out.println("ClassB的構造方法"); } { System.out.println("ClassB的構造代碼塊"); } public static ClassC classc = new ClassC(); public void excute(){ System.out.println("執行方法"); } }
public class ClassC { public ClassC(){ System.out.println("ClassC的構造方法"); } }
public class Test { static { System.out.println("Test的靜態代碼塊"); } public static void main(String[] args) { System.out.println("執行main方法"); ClassB b = new ClassB(); b.excute(); } }
執行結果:
Test的靜態代碼塊 執行main方法 ClassA的構造代碼塊 ClassA的構造方法 ClassA的靜態代碼塊 ClassB的靜態代碼塊 ClassC的構造方法 ClassA的構造代碼塊 ClassA的構造方法 ClassB的構造代碼塊 ClassB的構造方法 執行方法
通過執行結果可以看出:
1.先執行Test類的靜態代碼塊后執行Test類的main方法,說明要執行類的方法需要先加載這個類。
2.在創建ClassB的對象時,先去加載了父類ClassA。說明加載子類時如果沒有加載父類,會先加載父類。
3.靜態變量賦值和靜態代碼塊都會在類加載的時候執行,執行順序與靜態變量和靜態代碼塊出現的先后順序一致。
4.如果在類的靜態代碼塊執行之前創建該類的對象,則會先執行該類的構造代碼塊和構造方法。
5.構造代碼塊總是在構造函數之前執行。
6.創建子類對象,需要先初始化父類的對象。所以先執行父類的構造代碼塊和構造方法,再執行子類的構造代碼塊和構造方法。