人工智能AI面試題-1.3 Java類初始化順序
1.3 Java類初始化順序 讓我們以????的方式揭示Java類的初始化順序吧!先說結(jié)論:基類的靜態(tài)代碼塊和靜態(tài)成員字段,它們是??一起起飛的,誰在代碼中出現(xiàn)得早,誰先執(zhí)行。而且,只在第一次加載時(shí)執(zhí)行哦!接下來是派生類的靜態(tài)代碼塊和靜態(tài)成員字段,同樣也是??一組組合,誰在代碼中先現(xiàn)身,誰先出場,也只有第一次加載時(shí)亮相。 接下來,我們有基類的普通代碼塊和普通成員字段,同樣是一起來??馳騁,按照代碼中的排隊(duì)順序執(zhí)行。然后是基類的構(gòu)造函數(shù),它是整個(gè)初始化隊(duì)伍的??明星,最后上場。然后,派生類的普通代碼塊和普通成員字段也是??一起加入比賽,按照代碼中的排隊(duì)順序執(zhí)行,最后是派生類的構(gòu)造函數(shù),它們是這場初始化盛宴的??甜點(diǎn)。 接下來,我們用代碼?????來驗(yàn)證一下這個(gè)順序: ```java class Log { ??public static String initLog(String log) { ????System.out.println(log); ????return null; ??} } class Base { ??static { ????System.out.println("Base Static Block 1"); ??} ??private static String staticValue = Log.initLog("Base Static Fields"); ??static { ????System.out.println("Base Static Block 2"); ??} ??{ ????System.out.println("Base Normal Block 1"); ??} ??private String value = Log.initLog("Base Normal Field"); ??{ ????System.out.println("Base Normal Block 2"); ??} ??Base() { ????System.out.println("Base Constructor"); ??} } public class Derived extends Base { ??static { ????System.out.println("Static Block 1"); ??} ??private static String staticValue = Log.initLog("Static Fields"); ??static { ????System.out.println("Static Block 2"); ??} ??{ ????System.out.println("Normal Block 1"); ??} ??private String value = Log.initLog("Normal Field"); ??{ ????System.out.println("Normal Block 2"); ??} ??Derived() { ????System.out.println("Derived Constructor"); ??} } public static void main(String[] args) { ??Derived derived = new Derived(); } ``` 控制臺(tái)結(jié)果輸出如下,彩排完畢??: ``` Base Static Block 1 Base Static Fields Base Static Block 2 Static Block 1 Static Fields Static Block 2 Base Normal Block 1 Base Normal Field Base Normal Block 2 Base Constructor Normal Block 1 Normal Field Normal Block 2 Derived Constructor ```