轉載大神:https://blog.csdn.net/piaojun_pj/article/details/5888104
編譯並運行該程序會有以下輸出:
Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee()
下面我們來對結果做分析: 1 在代碼34行實例化對象時, 先對給靜態變量分配內存空間並初始化,然后執行靜態塊。 因此,在這里會輸出: Static Block Employee Company:china soft 而Employee Company:china soft的輸出也說明是先初始化靜態變量然后再執行靜態塊,否則company將為null。
2然后在內存中為Employee分配內存空間,並做默認初始化(即所有變量初始化為默認值,這里都初始化為null)。
3 默認初始化完成后,開始顯示初始化。即執行第5行,將phone初始化"0755-51595599",並且執行非靜態方法塊;因此在這里會有以下輸出: Non-Static Block Employee phone:0755-51595599
4 最后才調用默認構造函數,在默認構造函數中調用了帶參數的構造函數,所以在這里先輸出帶參數構造函數中的:Employee(String),然后才輸出:Empoloyee()。
上面的代碼中Manager繼承了前面寫的Employee類,當我們編譯並運行Manager類,會產生以下的輸出:
Static Block Employee Company:china soft Sub Static Block Manager department:sale Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()
下面我們對結果做分析:
1 在行34實例化對象時,由於Manager繼承了Employee,所以先從父類Employee開始;先給父類靜態變量分配內存空間並初始化,然后執行父類靜態塊。
然后再給子類靜態變量分配內存空間並初始化,然后執行子類靜態塊,所以會得到以下輸出: Static Block Employee Company:china soft Sub Static Block Manager department:sale
2然后在內存中為父類Employee分配內存空間,並做默認初始化;再為子類Manager分配內存空間,並做默認初始化。
3默認初始化完成后,從父類開始顯示初始化並執行非靜態方法塊和構造函數,然后再子類開始顯示初始化並執行非靜態方法塊和構造函數。
因此會產生以下的輸出: Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()
...............................
上面的執行完了 開始main()函數里的該干嘛干嘛
你永遠不知道博客園的排版有多丑