學習JAVA這門面向對象的語言,實質就是不斷地建立類,並把類實例化爲對象並調用方法。對於初學JAVA的人總搞清楚對象是如何實例化的,假如類之間存在繼承關係,那就更糊塗了。下面咱們經過兩個例題來講明對象的實例化過程。函數
編譯並運行該程序會有如下輸出 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()。學習
例2:.net
上面的代碼中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:saleblog
2而後在內存中爲父類Employee分配內存空間,並作默認初始化;再爲子類Manager分配內存空間,並作默認初始化。 3默認初始化完成後,從父類開始顯示初始化並執行非靜態方法塊和構造函數,而後再子類開始顯示初始化並執行非靜態方法塊和構造函數。所以會產生如下的輸出: Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()繼承
總結以上內容,能夠獲得對象初始化過程: 內存
一、 若是存在繼承關係,就先父類後子類; get
2 、若是在類內有靜態變量和靜態塊,就先靜態後非靜態,最後纔是構造函數; io
3 、繼承關係中,必需要父類初始化完成後,才初始化子類。編譯