一道代碼執行順序題
package test;
//代碼運行結果:finalValue_1
public class Child extends Base{
String str="finalValue_1";
public void preProcess() {
//System.out.println("賦值");
str="Child.preProcess";
}
public Child() {}
public static void main(String[] args) {
Child c=new Child();
System.out.println(c.str);
}
}
class Base {
public Base() {
this.preProcess();
}
public void preProcess() {
System.out.println("父類preProcess()");
}
}
//以上代碼執行順序:
/*
1.main: Child c=new Child();創建對象的時候調用構造方法
2.進入構造方法,成員變量str分配內存空間並初始化爲null
3.在構造中默認用super()調用父類無參構造
4.父類無參構造中調用this.preProcess(); 因爲preProcess()方法進行了重寫這裏用子類對象調用preProcess()
所以調用子類的preProcess方法(父類的preProcess方法沒有執行也沒有輸出),子類preProcess方法將str的值變爲"Child.preProcess"
5.父類無參構造執行結束回到子類無參構造,子類無參構造執行完畢後
6.對成員變量str再次賦值爲"finalValue_1"(故最終str的值爲"finalValue_1")
*/