JAVA類實例化時,子類和父類中的構造方法,靜態代碼塊,代碼塊和普通方法的調用順序

通過這篇文章總結一下JAVA類實例化時,子類和父類中的構造方法,靜態代碼塊,代碼塊和普通方法的調用順序,首先編寫兩個測試類:

父類:

public class Father {
    {
        System.out.println("父類代碼塊");
    }
    static {
        System.out.println("父類靜態代碼塊");
    }
    public Father(){
        System.out.println("父類構造方法");
        hehe();
    }
    public void hehe(){
        System.out.println("父類hehe方法");
    }
}

子類:

public class Son extends Father{
    {
        System.out.println("子類代碼塊");
    }
    static {
        System.out.println("子類靜態代碼塊");
    }
    public Son(){
        System.out.println("子類構造方法");
        hehe();
    }
    public void hehe(){
        System.out.println("子類hehe方法");
    }
}

測試方法:

public class Main {
    public static void main(String[] args) {
        Son s = new Son();
    }
}

輸出的順序是:

父類靜態代碼塊
子類靜態代碼塊
父類代碼塊
父類構造方法
子類hehe方法
子類代碼塊
子類構造方法
子類hehe方法

其實規律也很簡單,只有以下幾條:

  1. 靜態代碼塊在類加載時就會被執行;
  2. 子類的構造方法中會默認加上調用父類構造器的方法super(),並且加在構造器代碼的第一行;
  3. 普通代碼塊的方法會被編譯進構造器,並加在super()的後面;
  4. 調用類中的其他方法會默認加上this。

根據規則1,所以首先輸出的是靜態代碼塊中的內容,然後根據規則2,Son中調用super(),所以會先調用Father的構造器。又根據規則3,所以先輸出父類普通代碼塊中的內容,再輸出父類構造器的內容;父類中調用hehe(),調用方式可以看成this.hehe(),此時的this爲Son,所以輸出的是Son的hehe方法。接下來在輸出Son中的代碼塊和構造方法的內容,最後輸出Son的hehe方法內容。

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