構(gòu)造器
- 如果沒有主動創(chuàng)建構(gòu)造器羹呵,則會自動創(chuàng)建一個無參構(gòu)造器骂际,即默認構(gòu)造器。但一旦自己創(chuàng)建了構(gòu)造器冈欢,編譯器就不會幫你創(chuàng)建默認構(gòu)造器了歉铝,如果仍然想有一個無參構(gòu)造器,需要自己手動創(chuàng)建凑耻。
2.子構(gòu)造器必須且只能調(diào)用一次基類構(gòu)造器太示。默認會調(diào)用基類的默認構(gòu)造器,或者也可以手動調(diào)用基類的其他構(gòu)造器香浩。調(diào)用兩次基類構(gòu)造器時就會報錯了类缤。
- 成員變量先于構(gòu)造器執(zhí)行,即使構(gòu)造器的代碼位置夾在兩個成員變量的代碼位置的中間邻吭,也會先執(zhí)行成員變量的定義餐弱,再執(zhí)行構(gòu)造器。
有繼承時的初始化順序
/*
繼承時的初始化順序
*/
public class Order extends BaseOrder {
private int k = printInit("Order.k initialized");
/*static int printInit(String s) {
return 22;
}*/
public Order() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static Order.x2 initialized");
public static void main(String[] args) {
System.out.println("Order main start");
Order o = new Order();
}
}
class BaseOrder {
private int i = 9;
protected int j;
BaseOrder () {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
static {
System.out.println("BaseOrder static code start run");
}
private static int m = 123;
private static int x1 = printInit("static BaseOrder.x1 initialized");
static int printInit(String s) {
System.out.println(s);
System.out.println("current BaseOrder.m = " + m + ", n = " + n);
return 47;
}
private static int n = 321;
}
/* 運行結(jié)果
BaseOrder static code start run
static BaseOrder.x1 initialized
current BaseOrder.m = 123, n = 0
static Order.x2 initialized
current BaseOrder.m = 123, n = 321
Order main start
i = 9, j = 0
Order.k initialized
current BaseOrder.m = 123, n = 321
k = 47
j = 39
*/
- 首先找Order.main()方法囱晴,加載器開始啟動并尋找Order類的編譯代碼膏蚓,發(fā)現(xiàn)它有個基類BaseOrder, 所以開始加載BaseOrder。注:無論是否new一個基類的對象都會加載這個基類
- 執(zhí)行基類BaseOrder的靜態(tài)代碼速缆, 靜態(tài)代碼按照定義順義從上到下執(zhí)行降允。這里執(zhí)行靜態(tài)方法
printInit()
時,n還未賦值艺糜,所以為0,m已經(jīng)賦值了所以有值123幢尚∑仆#基類靜態(tài)代碼執(zhí)行完后再執(zhí)行導(dǎo)出類的靜態(tài)代碼。到此為止必要的類已經(jīng)加載完畢了
- 開始執(zhí)行導(dǎo)出類的
main()
方法尉剩。開始創(chuàng)建對象
- Order的構(gòu)造器中隱式調(diào)用了基類的構(gòu)造方法真慢,先執(zhí)行基類構(gòu)造器,再執(zhí)行子類成員函數(shù)再運行子類構(gòu)造函數(shù)理茎,在運行基類構(gòu)造器時黑界,上一步時執(zhí)行基類的成員函數(shù),再上一步是執(zhí)行基類的基類的的構(gòu)造函數(shù)皂林,一般記作先執(zhí)行成員函數(shù)再執(zhí)行構(gòu)造器朗鸠。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者