標籤:java執行個體化對象過程
當java執行個體化對象時,首先先進行類載入,類載入的整個過程是將類位元組碼引入記憶體,並未類中的static變數賦值。上篇文章已經大概分析了類的載入機制,下面講一下類的執行個體化過程。
首先引入範例程式碼
父類
package test;public class Fu {public int j = 9;public static int i = 10;static{i = 9;System.out.println("Fu靜態代碼塊");}{j = 10;System.out.println("Fu構造代碼塊");}public Fu(){System.out.println("Fu_構造方法");}public int getJ() {return j;}public void setJ(int j) {this.j = j;}public void a(){System.out.println("父類的a方法");};public static void staticMethod(){System.out.println("fu");}}
子類
package test;import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;public class Zi extends Fu{public int j = 0;static {i = 3;System.out.println("Zi靜態代碼塊");}public static int i = 2;{System.out.println("Zi構造代碼塊");}public Zi(){System.out.println("Zi構造方法");}public void a(){try {throw new Exception();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("子類的a方法");}public int getJ() {return j;}public void setJ(int j) {this.j = j;}}
執行如下代碼
程式列印結果為:
Fu靜態代碼塊
Zi靜態代碼塊
Fu構造代碼塊
Fu構造方法
Zi構造代碼塊
Zi構造方法
我們通過斷點debug對其進行跟蹤 得知具體的運行過程為:
首先先執行父類的靜態變數賦值和靜態代碼塊(具體執行順序根據程式書寫順序確定)
然後執行子類的靜態變數賦值和靜態代碼塊
之後執行父類的成員變數賦值語句(在此時之前子類的成員變數被java程式賦初值 zi對象內有兩個j變數 初始值都為0)
再執行父類的構造代碼塊
執行父類構造方法
執行子類成員賦值語句
執行子類構造代碼塊
執行子類構造方法
當我們執行如下語句時:
輸出的結果為
父類的j的值9
子類的j的值0
子類的a方法
特別的:
當子類方法覆蓋父類方法時,若父類方法沒有聲明拋出異常 則子類只能對可能出現異常的語句進行try—catch處理