通過這篇文章總結一下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方法
其實規律也很簡單,只有以下幾條:
- 靜態代碼塊在類加載時就會被執行;
- 子類的構造方法中會默認加上調用父類構造器的方法super(),並且加在構造器代碼的第一行;
- 普通代碼塊的方法會被編譯進構造器,並加在super()的後面;
- 調用類中的其他方法會默認加上this。
根據規則1,所以首先輸出的是靜態代碼塊中的內容,然後根據規則2,Son中調用super(),所以會先調用Father的構造器。又根據規則3,所以先輸出父類普通代碼塊中的內容,再輸出父類構造器的內容;父類中調用hehe(),調用方式可以看成this.hehe(),此時的this爲Son,所以輸出的是Son的hehe方法。接下來在輸出Son中的代碼塊和構造方法的內容,最後輸出Son的hehe方法內容。