java類的加載和執行順序


  以前面試總會碰到涉及到類的執行過程的筆試題。下面記錄我自己的測試結果:

 

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.創建子類對象,需要先初始化父類的對象。所以先執行父類的構造代碼塊和構造方法,再執行子類的構造代碼塊和構造方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM