關於靜態塊、靜態屬性、構造塊、構造方法的執行順序

示例代碼

public class HelloA {
    
    private static String staticStr = getStaticStr();
    private String str = getStr();
    
    //父類構造方法
    public HelloA(){
        System.out.println("父類構造方法");
    }
    //父類代碼塊
    {
        System.out.println("父類代碼塊");
    }
    //靜態代碼塊
    static{
        System.out.println("父類靜態代碼塊");
    }
    
    //父類靜態屬性初始化
    private static String getStaticStr() {
        System.out.println("父類靜態屬性初始化");
        return null;
    }
    
     private String getStr() {
          System.out.println("父類實例屬性初始化");
          return null;
     }
}

 class HelloB extends HelloA {
     private static String staticStr = getStaticStr();
     private String str = getStr();
    //構造方法
    public HelloB(){
         System.out.println("子類構造方法");
    }
    //子類代碼塊
    {
        System.out.println("子類代碼塊");
    }
    //子類靜態代碼塊
    static{
            System.out.println("子類靜態代碼塊");
    }    
    
    //子類靜態屬性
    private static String getStaticStr() {
        System.out.println("子類靜態屬性初始化");
        return null;
    }
    
    //子類實例屬性初始化
    private String getStr() {
         System.out.println("子類實例屬性初始化");
         return null;
    }
    
}

執行一次  new HelloB();

執行順序:加載父類類對象:父類靜態屬性 > 父類靜態塊>

                  加載子類類對象:子類靜態屬性>子類靜態塊 >

                   父類實例化:父類實例屬性初始化 > 父類普通代碼塊>父類構造方法 >

                   子類實例化:子類實例屬性初始化 > 子類普通代碼塊>子類構造方法>

 執行多次  new HelloB(); new HelloB() (此類被加載過,不再加載父類和子類的類對象,則只加載一次)

執行順序:加載父類類對象:父類靜態屬性 > 父類靜態塊>

                  加載子類類對象:子類靜態屬性>子類靜態塊 >

                   父類實例化:父類實例屬性初始化 > 父類普通代碼塊>父類構造方法 >

                   子類實例化:子類實例屬性初始化 > 子類普通代碼塊>子類構造方法>               

                   父類實例化:父類實例屬性初始化 > 父類普通代碼塊>父類構造方法 >

                   子類實例化:子類實例屬性初始化 > 子類普通代碼塊>子類構造方法>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章