該項目源碼地址:https://github.com/lastwhispers/code/tree/master/java-basic
先編寫一個父類缘揪,有靜態(tài)代碼塊、代碼塊找筝、構造函數
public class SuperClass {
static {
System.out.println("父類的靜態(tài)代碼塊");
}
{
System.out.println("父類的代碼塊");
}
public SuperClass() {
System.out.println("父類的構造函數");
}
}
再編寫一個子類繼承父類,靜態(tài)代碼塊袖裕、代碼塊、構造函數
public class SubClass extends SuperClass {
static {
System.out.println("子類的靜態(tài)代碼塊");
}
{
System.out.println("子類的代碼塊");
}
public SubClass() {
System.out.println("子類的構造函數");
}
}
編寫一個測試類
public class Test {
public static void main(String[] args) {
new SubClass();
}
}
運行結果:
父類的靜態(tài)代碼塊
子類的靜態(tài)代碼塊
父類的代碼塊
父類的構造函數
子類的代碼塊
子類的構造函數
即谤民,靜態(tài)代碼塊、代碼塊赖临、構造函數初始化順序為靜態(tài)代碼塊>代碼塊>=構造函數
父類與子類的初始化順序為:
父類>子類
原因
- 類的初始化優(yōu)先于類的對象創(chuàng)建(Java類加載的完整過程)。
- 子類初始化之前必須先初始化父類(Java類加載的完整過程)兢榨。
- 子類創(chuàng)建對象時顺饮,子類的構造函數會先調用父類的構造函數。
- 由于靜態(tài)代碼塊是在類的初始化兼雄,代碼塊和構造函數是創(chuàng)建對象時調用的,所以“代碼塊和構造函數”是一起執(zhí)行的赦肋。