在下面的Java代碼中,Insect類由Beetle類繼承。Java - 此代碼中初始化的順序是什麼?
class Insect {
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1
= printInit("static Insect.x1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2
= printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
輸出以某種方式混淆。
靜態Insect.x1初始化
靜態Beetle.x2初始化
甲殼蟲構造
I = 9,J = 0
Beetle.k初始化
ķ = 47 j = 39
在這個特定的例子中初始化的順序是什麼?
爲什麼在x1之後立即初始化x2?爲什麼主要方法的第一行(System.out.println("Beetle constructor");
),在 x1和x2 intializaton之後執行。所以令人滿意。
我知道派生類構造函數會自動調用基類構造函數(除非它有參數並且使用super關鍵字)。我知道變量在構造函數之前被初始化,並且靜態變量在其他變量之前被初始化。
所以我可以說,作爲一般規則,即: 1.基類的靜態成員首先初始化, 2.在派生類靜態成員初始化接下來, 3.基類的非靜態成員(原語和引用)被初始化 4.基類構造函數被調用 5.派生類非靜態成員被初始化 6.最後,我有我需要的一切來創建對象,所以派生類構造函數被調用。 對嗎? –
@HelloLili在這個簡單的情況下是的,但我會小心使用它作爲一般規則。 Java按Java語言規範中定義的一組規則工作。我認爲你最好學習如何觸發某些行動。請記住,「加載一個類會觸發其靜態成員的初始化」,而不是「靜態成員優先」等等。 –