Java類初始化過程

openkk 12年前發布 | 24K 次閱讀 Java開發 Java

/*
測試3個內容:
類加載順序
子父類執行過程
對象初始化過程

從幾次試驗我們看到 當執行到類時,類被加載到內存,并初始化 靜態成員被加載到共享區 不用實例化對象就可以調用靜態資源

靜態成員變量,靜態成員方法,靜態代碼塊,只初始化一次

而普通變量,普通代碼塊,構造方法,在每次實例化對象時都要初始化

子類對象要初始化時, 會先初始化父類靜態成員和靜態代碼塊, 再初始化子類靜態成員和靜態代碼塊, 然后是父類普通代碼塊,父類構造方法 然后是子類普通代碼塊,子類構造函數

當子類名直接調用繼承自父類的靜態成員時,子類不會初始化,而只初始化父類(因為這已經足夠了)

*/

class Fu //父類 { public static String staticField = "父類-靜態變量"; public static String extend = "父類-靜態變量extend"; //讓子類調用 public String field = "父類-普通變量"; public Fu() { System.out.println("父類-構造方法"); }

static { System.out.println("Fu_static: 父類-靜態初始化塊"); System.out.println("Fu_static:"+staticField);
}

{ System.out.println("Fu_普通塊:"+field); System.out.println("Fu_普通塊:"+"父類-初始化塊"); } }

class Zi extends Fu //子類 { public static String staticField = "子類 靜態變量";

public String field = "子類 普通變量";

{ System.out.println("Zi_普通塊:"+field); System.out.println("Zi_普通塊:"+"子類 初始化塊"); }

public Zi() { System.out.println("子類 子類構造方法"); }

static { System.out.println("Zi_static:"+"子類 靜態初始化塊"); System.out.println("Zi_static:"+staticField); }

}

class Demo
{ public static void main(String args[]) throws Exception { System.out.println("main方法"); //Thread.sleep(2000); //System.out.println("Zi.staticField:"+Zi.staticField);

  //Thread.sleep(2000);
  //System.out.println("...");
  //Fu fu = new Fu();

  Thread.sleep(2000);
  System.out.println("");

  Zi zi = new Zi();
  System.out.println("");
  Zi zi2 = new Zi();      
  //System.out.println(Zi.extend);  //子類名調用父類靜態成員

}

} </pre>轉自: http://xouou.iteye.com/blog/1333841

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!