4 回答

TA貢獻1890條經(jīng)驗 獲得超9個贊
自動動手調(diào)試一下就什么都清楚了
java的初始化順序,靜態(tài)變量、靜態(tài)快、變量、初始化塊、構(gòu)造方法,如果在構(gòu)造方法中調(diào)用了重載的構(gòu)造方法,那第一次調(diào)用的構(gòu)造方法就不會進行對象變量的初始化了
java的構(gòu)造方法的重載調(diào)用只能在第一行,原因也在于此;至于為何這么設(shè)計,我也不懂
你的代碼里面,先執(zhí)行的
this("a在類帶參構(gòu)造方法中的值:" + a); // 調(diào)用另外一個構(gòu)造方法
之后又執(zhí)行的變量和初始化快
用IDE的單步調(diào)試看一下就明白了

TA貢獻1886條經(jīng)驗 獲得超2個贊
public static int a = 0;
static { a = 10; System.out.println("靜態(tài)代碼塊在執(zhí)行a=" + a); }
相當(dāng)于下面的代碼
public static int a;

TA貢獻1765條經(jīng)驗 獲得超5個贊
因為你存在兩個構(gòu)造函數(shù), 當(dāng)你在執(zhí)行第一個構(gòu)造函數(shù)時, 已經(jīng)轉(zhuǎn)入另外一個構(gòu)造方法,而在這時你傳入的形參為10, 所以在第2個構(gòu)造方法中n并不是對a的引用, 況且a是int型, 本身就只是常量, 不存在地址的引用, 所以第一條輸出語句為你傳入的形參10

TA貢獻1878條經(jīng)驗 獲得超4個贊
Object是所有類的超類,在java的構(gòu)造其中this或者super必須放在構(gòu)造器的第一行執(zhí)行,在沒署名的情況下,每個類的構(gòu)造方法第一行調(diào)用super(),這樣才能完成父類的初始化(同類中的構(gòu)造器必然會用一個調(diào)用到父類的構(gòu)造器),
這個過程可能是一個遞歸構(gòu)造鏈,最終回歸到Object。
這里用本類帶參的構(gòu)造方法代替了默認的super(),所以講通過this(String n)這個構(gòu)造方法來完成父類的初始化,為了調(diào)用this(String n),就需要先將它的參數(shù)裝配好,因此第三行輸出的是10.
寫出來可能更好理解
[code="java"]
public TestStaticCon(String n) {
[color=red] super();[/color]
System.out.println(n);
System.out.println(a);
}
希望能對你有幫助.
添加回答
舉報