這篇文章主要講解了“Java類的初始化順序是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java類的初始化順序是什么”吧!
成都創(chuàng)新互聯(lián)長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為廣陽企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站制作,廣陽網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
多說無益,以下是本人親自試驗(yàn)的代碼,一目了然:
1 package test1; 2 3 public class Test { 4 public static void main(String[] argc) { 5 new Child(); 6 System.out.println("================================"); 7 new Child(); 8 } 9 } 10 11 class Child extends Parent{ 12 private static String staticField = getStaticField(); 13 static { 14 System.out.println("child靜態(tài)方法塊初始化"); 15 } 16 private String field = getField(); 17 { 18 System.out.println("child普通方法塊初始化"); 19 } 20 21 public Child() { 22 System.out.println("child構(gòu)造函數(shù)初始化"); 23 } 24 25 public static String getStaticField() { 26 System.out.println("child靜態(tài)屬性初始化"); 27 return "staticField"; 28 } 29 30 public static String getField() { 31 System.out.println("child普通屬性初始化"); 32 return "field"; 33 } 34 } 35 36 class Parent { 37 private static String staticField = getStaticField(); 38 static { 39 System.out.println("parent靜態(tài)方法塊初始化"); 40 } 41 private String field = getField(); 42 { 43 System.out.println("parent普通方法塊初始化"); 44 } 45 46 public Parent() { 47 System.out.println("parent構(gòu)造函數(shù)初始化"); 48 } 49 50 public static String getStaticField() { 51 System.out.println("parent靜態(tài)屬性初始化"); 52 return "staticField"; 53 } 54 55 public static String getField() { 56 System.out.println("parent普通屬性初始化"); 57 return "field"; 58 } 59 }
打印結(jié)果:
1 parent靜態(tài)屬性初始化 2 parent靜態(tài)方法塊初始化 3 child靜態(tài)屬性初始化 4 child靜態(tài)方法塊初始化 5 parent普通屬性初始化 6 parent普通方法塊初始化 7 parent構(gòu)造函數(shù)初始化 8 child普通屬性初始化 9 child普通方法塊初始化 10 child構(gòu)造函數(shù)初始化 11 ================================ 12 parent普通屬性初始化 13 parent普通方法塊初始化 14 parent構(gòu)造函數(shù)初始化 15 child普通屬性初始化 16 child普通方法塊初始化 17 child構(gòu)造函數(shù)初始化
經(jīng)過替換靜態(tài)屬性和靜態(tài)初始化塊的聲明順序發(fā)現(xiàn)靜態(tài)屬性和靜態(tài)初始化塊的初始化順序和聲明順序有關(guān),同理,普通屬性和普通初始化塊的的初始化順序和聲明順序有關(guān)。
總結(jié):
當(dāng)某一個(gè)類滿足初始化的條件時(shí)(以后的博客中會(huì)有總結(jié)),先會(huì)初始化父類(從頂級(jí)父類Object依次向下初始化),然后初始化子類;
初始化該類時(shí),最先初始化靜態(tài)屬性和靜態(tài)初始化塊(和聲明順序有關(guān)),從頂級(jí)父類Object依次向下初始化;
通過new創(chuàng)建對(duì)象時(shí),先初始化普通屬性和普通初始化塊(和聲明順序有關(guān)),再調(diào)用構(gòu)造方法,同樣從頂級(jí)父類Object依次向下執(zhí)行;
靜態(tài)屬性和靜態(tài)初始化塊只會(huì)初始化一次,類初始化后,再次通過new創(chuàng)建對(duì)象,只會(huì)重復(fù)執(zhí)行第三步。
接下來引用Java編程思想的一句話:
在類的內(nèi)部,變量定義的先后順序決定了初始化的順序,即使變量定義散布于方法定義之間,它們?nèi)耘f會(huì)在任何方法(包括構(gòu)造器)被調(diào)用之前得到初始化。
感謝各位的閱讀,以上就是“Java類的初始化順序是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java類的初始化順序是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!