類Person和子類Son,體現對象初始化流程的代碼:




























































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


















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