/*
測試3個内容:
類加載順序
子父類執行過程
對象初始化過程
從幾次試驗我們看到
當執行到類時,類被加載到記憶體,并初始化
靜态成員被加載到共享區
不用執行個體化對象就可以調用靜态資源
靜态成員變量,靜态成員方法,靜态代碼塊,隻初始化一次
而普通變量,普通代碼塊,構造方法,在每次執行個體化對象時都要初始化
子類對象要初始化時,
會先初始化父類靜态成員和靜态代碼塊,
再初始化子類靜态成員和靜态代碼塊,
然後是父類普通代碼塊,父類構造方法
然後是子類普通代碼塊,子類構造函數
當子類名直接調用繼承自父類的靜态成員時,子類不會初始化,而隻初始化父類(因為這已經足夠了)
補充:子類的所有構造方法中,如果未指定父類構造方法,則第一條語句是隐式的super(),即父類的空參數構造方法*/
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); //子類名調用父類靜态成員
}
}
執行結果情況太多就不貼了