從今日頭條上看到了一道考察Java類加載機(jī)制的基礎(chǔ)題诫肠,感覺不錯(cuò)菩貌,只是沒有看到答案卢佣,所以自己手動(dòng)敲了一下代碼,現(xiàn)將其整理如下:
題目
1.父類A箭阶、子類B(繼承自父類A)虚茶、程序入口類C
public class HelloA {
public HelloA() {
System.out.println("父類A 構(gòu)造方法");
}
{ System.out.println("父類A 構(gòu)造代碼塊"); }
static { System.out.println("父類A 靜態(tài)方法"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("子類B 構(gòu)造方法");
}
{ System.out.println("子類B 構(gòu)造代碼塊"); }
static { System.out.println("子類B 靜態(tài)方法"); }
}
//程序入口類
public class HelloC {
public static void main(String[] args){
System.out.println("-----------main start-----------");
new HelloB();
System.out.println("-----------main end-------------");
}
}
運(yùn)行結(jié)果如下:
-----------main start-----------
父類A 靜態(tài)方法
子類B 靜態(tài)方法
父類A 構(gòu)造代碼塊
父類A 構(gòu)造方法
子類B 構(gòu)造代碼塊
子類B 構(gòu)造方法
-----------main end-------------
2.父類A、子類B(繼承自父類A)仇参,程序入口在B類中
public class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class."); }
static { System.out.println("Static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class."); }
static { System.out.println("Static B"); }
public static void main(String[] args){
System.out.println("-----------main start-----------");
new HelloB();
System.out.println("-----------main end-------------");
}
}
運(yùn)行結(jié)果如下:
父類A 靜態(tài)方法
子類B 靜態(tài)方法
-----------main start-----------
父類A 構(gòu)造代碼塊
父類A 構(gòu)造方法
子類B 構(gòu)造代碼塊
子類B 構(gòu)造方法
-----------main end-------------
3.父類A嘹叫、子類B(繼承自父類A),程序入口在A類中
public class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class."); }
static { System.out.println("Static A"); }
public static void main(String[] args){
System.out.println("-----------main start-----------");
new HelloB();
System.out.println("-----------main end-------------");
}
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class."); }
static { System.out.println("Static B"); }
}
運(yùn)行結(jié)果如下:
父類A 靜態(tài)方法
-----------main start-----------
子類B 靜態(tài)方法
父類A 構(gòu)造代碼塊
父類A 構(gòu)造方法
子類B 構(gòu)造代碼塊
子類B 構(gòu)造方法
-----------main end-------------
簡(jiǎn)單總結(jié):
1.實(shí)例化子類的時(shí)候
(1)若此類未被加載過诈乒,首先加載是父類的類對(duì)象罩扇,然后加載子類的類對(duì)象,接著實(shí)例化父類抓谴,最后實(shí)例化子類;
(2)若此類被加載過暮蹂,不再加載父類和子類的類對(duì)象。
2.接下來是加載順序
(1)當(dāng)加載類對(duì)象時(shí)癌压,首先初始化靜態(tài)屬性仰泻,然后執(zhí)行靜態(tài)塊;
(2)當(dāng)實(shí)例化對(duì)象時(shí)滩届,首先執(zhí)行構(gòu)造塊(直接寫在類中的代碼塊)集侯,然后執(zhí)行構(gòu)造方法被啼。
(3)如果存在多個(gè)靜態(tài)塊,各靜態(tài)塊之間執(zhí)行的順序按代碼先后棠枉;如果存在多個(gè)靜態(tài)屬性浓体,各靜態(tài)屬性初始化的順序按代碼先后。
(4)屬性辈讶、構(gòu)造塊(也就是上面的實(shí)例塊)命浴、構(gòu)造方法之間的執(zhí)行順序(但構(gòu)造塊一定會(huì)在構(gòu)造方法前執(zhí)行),也是按代碼的先后順序贱除。
3.還要注意入口函數(shù)位置生闲、類的執(zhí)行順序;
本人java小白月幌,有錯(cuò)誤還請(qǐng)指出碍讯,共同學(xué)習(xí)...
參考資料:
(1)Java---類加載機(jī)制,構(gòu)造方法扯躺,靜態(tài)變量捉兴,(靜態(tài))代碼塊国葬,父類灼狰,變量加載順序
https://www.cnblogs.com/chihirotan/p/6043442.html
(2)一道網(wǎng)易Java工程師面試題看出你對(duì)Java類加載機(jī)制的理解深淺
http://url.cn/57lX6cG