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