public class A {
public A() {init();}
protected void init() {}
static class B extends A{
int i,j=999;
protected void init() {
System.out.println("此時A的構造方法正在調用此方法:i的值為:"+i+",j的值為:"+j);
i=888;
j=111;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println("最終i的值為:"+b.i+",j的值為:"+b.j);
}
}
輸出結果:此時A的構造方法正在調用此方法:i的值為:0,j的值為:0
最終i的值為:888,j的值為:999
樓主這道題剛開始看確實有點詭異。所以我只能根據結果來推斷。
首先在執行B b = new B();的時候,會調用B的構造函數,而B是繼承A的,相當於在B的構造函數中有super();這一句,所以會執行A的構造函數。而A的構造函數又調用了init方法。可這裡A的init方法已經被B給重寫了,而且這裡是生成的B的實例,所以會執行B的init方法。執行完後i=888,j=111.這時構造方法執行完畢,開始執行賦值操作,而成員變量i並沒有賦值操作,i還是等於888,而j已經做了賦值操作,所以j被賦值為999.你可以給i一個賦值測試一下,發現i的值會是你賦的值。至於為什麼先執行構造函數再執行賦值操作,你可以谷歌搜索JVM類加載子系統的執行過程。