聯(lián)動:為什么構(gòu)造代碼塊先于構(gòu)造函數(shù)執(zhí)行?
梳理一下Java中類的加載順序~
//父類
public class Father {
static {
System.out.println("父類靜態(tài)代碼塊...");
}
{
System.out.println("父類構(gòu)造代碼塊...");
}
public Father() {
System.out.println("父類構(gòu)造函數(shù)...");
}
public void run() {
System.out.println("父類方法...");
}
}
//子類
public class Son extends Father {
public static int a = 1;
static {
a = 2;
System.out.println("子類靜態(tài)代碼塊...");
}
public String name;
public Son(String name) {
System.out.println("子類構(gòu)造函數(shù)...");
this.name = name;
}
{
a = 3;
System.out.println("子類構(gòu)造代碼塊...");
}
@Override
public void run() {
System.out.println("子類復(fù)寫父類方法: " + a);
}
public static void main(String[] args) {
Father father = new Son("java boy");
father.run();
new Son("java boy");
}
}
打印結(jié)果:
父類靜態(tài)代碼塊...
子類靜態(tài)代碼塊...
父類構(gòu)造代碼塊...
父類構(gòu)造函數(shù)...
子類構(gòu)造代碼塊...
子類構(gòu)造函數(shù)...
子類復(fù)寫父類方法: 3
父類構(gòu)造代碼塊...
父類構(gòu)造函數(shù)...
子類構(gòu)造代碼塊...
子類構(gòu)造函數(shù)...
結(jié)論:
1. 父類先于子類進(jìn)行初始化;
2. 靜態(tài)代碼塊隨著類的加載而加載,且只執(zhí)行一次;
3. 構(gòu)造代碼塊先于構(gòu)造函數(shù)執(zhí)行,兩者每new一次就執(zhí)行一次;
4. 從以上3點(diǎn)可以得出執(zhí)行順序:父類靜態(tài)代碼塊->子類靜態(tài)代碼塊->父類構(gòu)造代碼塊->父類構(gòu)造函數(shù)->子類構(gòu)造代碼塊->子類構(gòu)造函數(shù)。