該項(xiàng)目源碼地址:https://github.com/lastwhispers/code/tree/master/java-basic
先編寫一個父類,有靜態(tài)代碼塊、代碼塊、構(gòu)造函數(shù)
public class SuperClass {
static {
System.out.println("父類的靜態(tài)代碼塊");
}
{
System.out.println("父類的代碼塊");
}
public SuperClass() {
System.out.println("父類的構(gòu)造函數(shù)");
}
}
再編寫一個子類繼承父類,靜態(tài)代碼塊、代碼塊、構(gòu)造函數(shù)
public class SubClass extends SuperClass {
static {
System.out.println("子類的靜態(tài)代碼塊");
}
{
System.out.println("子類的代碼塊");
}
public SubClass() {
System.out.println("子類的構(gòu)造函數(shù)");
}
}
編寫一個測試類
public class Test {
public static void main(String[] args) {
new SubClass();
}
}
運(yùn)行結(jié)果:
父類的靜態(tài)代碼塊
子類的靜態(tài)代碼塊
父類的代碼塊
父類的構(gòu)造函數(shù)
子類的代碼塊
子類的構(gòu)造函數(shù)
即,靜態(tài)代碼塊、代碼塊、構(gòu)造函數(shù)初始化順序?yàn)?strong>靜態(tài)代碼塊>代碼塊>=構(gòu)造函數(shù)
父類與子類的初始化順序?yàn)椋?br> 父類>子類
原因
- 類的初始化優(yōu)先于類的對象創(chuàng)建(Java類加載的完整過程)。
- 子類初始化之前必須先初始化父類(Java類加載的完整過程)。
- 子類創(chuàng)建對象時,子類的構(gòu)造函數(shù)會先調(diào)用父類的構(gòu)造函數(shù)。
- 由于靜態(tài)代碼塊是在類的初始化,代碼塊和構(gòu)造函數(shù)是創(chuàng)建對象時調(diào)用的,所以“代碼塊和構(gòu)造函數(shù)”是一起執(zhí)行的。