class Insect...{
private int i = 9;
int j;
Insect()...{
System.out.println("i=" + i + ",j=" + j);
j=37;
}
private static int x1 = print("static Insect.x1.initialized");
public static int print(String s)...{
System.out.println(s);
return 47;
}
}
class Bettle extends Insect...{
private int k = print("Bettle.k initialized");
public Bettle()...{
System.out.println("k=" + k);
System.out.println("j=" + j);
}
private static int x2=print("static Insect.x2 initialized");
public static void main(String [] args) ...{
System.out.println("Bettle constructor");
Bettle b = new Bettle();
}
}
運行結果:
static Insect.x1.initialized
static Insect.x2 initialized
Bettle constructor
i=9,j=0
Bettle.k initialized
k=47
j=37
解釋:
Bettle運行需要先載入父類Insect,在載入Insect時先運行所有的Static代碼,print()函數建立,但不運行.
這一句會運行:private static int x1 = print("static Insect.x1.initialized");
父類載入完成後載入子類Bettle,同樣先初始化所有static代碼,於是先運行:private static int x2=print("static Insect.x2 initialized");
然後進入main(),運行System.out.println("Bettle constructor");
再運行Bettle b=new Bettle();建立對象時先建立父類,此時先把所有變數設為初始值(i=9,j=0),然後觸發父類constructor.
載入完父類再載入子類,同上先設定義值:private int k=print("Bettle.k initialized");然後運行建構函式