多說無益,以下是本人親自試驗的代碼,一目了然:
?????????????????????????????System.out.println("================================"??????????????Child????????String?staticField?=??????????????System.out.println("child靜態(tài)方法塊初始化"???????String?field?=??????????System.out.println("child普通方法塊初始化"????????????????System.out.println("child構造函數(shù)初始化"?????????????????System.out.println("child靜態(tài)屬性初始化"??????????"staticField"?????????????????System.out.println("child普通屬性初始化"??????????"field"???????????String?staticField?=??????????????System.out.println("parent靜態(tài)方法塊初始化"???????String?field?=??????????System.out.println("parent普通方法塊初始化"????????????????System.out.println("parent構造函數(shù)初始化"?????????????????System.out.println("parent靜態(tài)屬性初始化"??????????"staticField"?????????????????System.out.println("parent普通屬性初始化"??????????"field"??}
打印結果:
?????????????????child構造函數(shù)初始化
?
經(jīng)過替換靜態(tài)屬性和靜態(tài)初始化塊的聲明順序發(fā)現(xiàn)靜態(tài)屬性和靜態(tài)初始化塊的初始化順序和聲明順序有關,同理,普通屬性和普通初始化塊的的初始化順序和聲明順序有關。
總結:
- 當某一個類滿足初始化的條件時(以后的博客中會有總結),先會初始化父類(從頂級父類Object依次向下初始化),然后初始化子類;
- 初始化該類時,最先初始化靜態(tài)屬性和靜態(tài)初始化塊(和聲明順序有關),從頂級父類Object依次向下初始化;
- 通過new創(chuàng)建對象時,先初始化普通屬性和普通初始化塊(和聲明順序有關),再調(diào)用構造方法,同樣從頂級父類Object依次向下執(zhí)行;
- 靜態(tài)屬性和靜態(tài)初始化塊只會初始化一次,類初始化后,再次通過new創(chuàng)建對象,只會重復執(zhí)行第三步。
接下來引用Java編程思想的一句話:
在類的內(nèi)部,變量定義的先后順序決定了初始化的順序,即使變量定義散布于方法定義之間,它們?nèi)耘f會在任何方法(包括構造器)被調(diào)用之前得到初始化。