理解關(guān)于java類的加載順序
首先來捋一捋java類的加載順序吧
- 父類靜態(tài)代碼塊 》》靜態(tài)代碼初始化纽帖,靜態(tài)屬性(帶有static)幽崩,不包括靜態(tài)方法
- 子類的靜態(tài)代碼 》》靜態(tài)代碼初始化围段,靜態(tài)屬性(帶有static),不包括靜態(tài)方法
- 父類非靜態(tài)代碼塊 》非靜態(tài)代碼塊椿胯,非靜態(tài)屬性(無static)
- 父類構(gòu)造函數(shù)
- 子類非靜態(tài)方法 》非靜態(tài)代碼塊述么,非靜態(tài)屬性(無static)
- 子類構(gòu)造函數(shù)
上代碼
public class test3 {
private String baseName = "base";
public test3(){
System. out. println("執(zhí)行父類的test3()");
callName();
}
public void callName(){
System. out. println("執(zhí)行父類的callName()");
System. out. println(baseName);
}
//內(nèi)部類繼承
static class Sub extends test3
{
private String baseName = "sub";
@Override
public void callName(){
System. out. println("執(zhí)行子類的callName()");
System. out. println(baseName);
}
}
public static void main(String[] args)
{
test3 b = new Sub();
}
}
運(yùn)行結(jié)果
image
代碼執(zhí)行流程
1. main方法執(zhí)行test3 b=new Sub(),會(huì)執(zhí)行父類的構(gòu)造函數(shù)test3();
2. test3()里有方法callName(),會(huì)優(yōu)先到子類里查詢又沒有這個(gè)方法菲宴,如果沒有則會(huì)執(zhí)行父類的callName()方法贷祈。
3. 由于子類有這個(gè)方法,所以執(zhí)行子類的callName()方法喝峦,由于當(dāng)前只執(zhí)行到父類的構(gòu)造函數(shù)势誊,子類的非靜態(tài)屬性baseName還未加載,所以會(huì)返回null谣蠢;
加一點(diǎn)料
如果再main方法里加個(gè)調(diào)用方法
public static void main(String[] args)
{
test3 b = new Sub();
b.callName();
}
結(jié)果
blob.jpg
可以看到粟耻,此時(shí)會(huì)輸出子類的baseName屬性,因?yàn)榇藭r(shí)子類的非靜態(tài)屬性已經(jīng)通過調(diào)用反法加載了
以上純屬個(gè)人理解眉踱,如有錯(cuò)誤挤忙,請(qǐng)大佬指出;