出處:http://blog.csdn.net/andrew323/article/details/4665379函數
下面咱們經過兩個例題來講明對象的實例化過程。
例1:
編譯並運行該程序會有如下輸出
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()。 spa
例2:
上面的代碼中Manager繼承了前面寫的Employee類,當咱們編譯並運行Manager類,會產生如下的輸出:.net
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默認初始化完成後,從父類開始顯示初始化並執行非靜態方法塊和構造函數,而後再子類開始顯示初始化並執行非靜態方法塊和構造函數。所以會產生如下的輸出:
Employee phone:0755-51595599
Employee(String)
Empoloyee()
Sub Non-Static Block
Manager salary:8000
Manager(String)
Manager() blog
總結以上內容,能夠獲得對象初始化過程:
1 若是存在繼承關係,就先父類後子類;
2 若是在類內有靜態變量和靜態塊,就先靜態後非靜態,最後纔是構造函數;
3 繼承關係中,必需要父類初始化完成後,才初始化子類。繼承