類Person和子類Son,體現(xiàn)對象初始化流程的代碼:




























































執(zhí)行結(jié)果:
Person static...static塊1
Bow(3)
Person static...static塊2
Test static...static塊1
Bow(6)
Test static2...static塊2
main...
Bow(1)
Person hello...非static塊1
Bow(2)
Person hello...非static塊2
Person...Person類的構(gòu)造器
Bow(4)
Test hello1...非static塊1
Bow(5)
Test hello2...非static塊2
Test...Test類的構(gòu)造器
從上面結(jié)果,可以總結(jié)出JAVA對象初始化的流程:
【1】父類static塊和父類static屬性(兩者的執(zhí)行先后順序依據(jù)它們在類中具體位置由上至下)
【2】子類static塊和子類static屬性(兩者的執(zhí)行先后順序依據(jù)它們在類中具體位置由上至下)
【3】執(zhí)行main方法中new關(guān)鍵字之前的代碼塊
【4】父類非static塊執(zhí)行和父類非static屬性(兩者的執(zhí)行先后順序依據(jù)它們在類中具體位置由上至下,如果屬性為實例類型,則執(zhí)行該實例所在類的非static塊和非static屬性,再執(zhí)行該類的構(gòu)造器,即[4][5]步驟)
【5】父類構(gòu)造器(完成非static屬性初始值的設(shè)置)
【6】子類非static塊執(zhí)行和子類非static屬性(兩者的執(zhí)行先后順序依據(jù)它們在類中具體位置由上至下,如果屬性為實例類型,則執(zhí)行該實例所在類的非static塊和非static屬性,再執(zhí)行該類的構(gòu)造器,即[6][7]步驟)
【7】子類構(gòu)造器(完成非static屬性初始值設(shè)置,如果在子類構(gòu)造器執(zhí)行前就返回該非static屬性,則該非static屬值為屬性默認(rèn)值)
注:針對第【7】點“子類構(gòu)造器執(zhí)行前就返回該非static屬性”,具體可以見下例:


















instance1 value is: 0 因為new 子類ChildObjectInit時,會先初始化父類ParentObjectInit,繼而調(diào)用父來構(gòu)造器器,接著執(zhí)行此構(gòu)造器中的test()方法,基于多態(tài)性,會轉(zhuǎn)而調(diào)用子類的test()方法執(zhí)行子類test()方法代碼體,打印出instanceValue的屬性默認(rèn)值。(因為此時打印instanceValue值后,父類構(gòu)造器才執(zhí)行結(jié)束返回,根本還沒輪到子類的初始化工作和子類構(gòu)造器的執(zhí)行。)