用這題目吸引大家注意,請見諒!
以下代碼有些朋友可能會似曾熟識,可能也算不上“原創”,請見諒!
不過,我出的這題,確定有點意思,考考大家。
/**
* 父類
* @author rongxinhua
*
*/
public class Father{
private String name="FATHER";
public Father(){
whoAmI();
tellName(name);
}
public void whoAmI(){
System.out.println("Father says, I am " + name);
}
public void tellName(String name){
System.out.println("Father's name is " + name);
}
}
/**
* 子類
* @author rongxinhua
*
*/
public class Son extends Father{
private String name="SON";
public Son(){
whoAmI();
tellName(name);
}
public void whoAmI(){
System.out.println("Son says, I am " + name);
}
public void tellName(String name){
System.out.println("Son's name is " + name);
}
}
問題:當執行
Father who = new Son(); 時,會輸出什么?
如果你去參加一個公司的筆試或面試時問了這么一道題,在沒有環境測試的情況下,你會猜測什么答案?
這個題目其實是一個小Trick,要注意whoAmI和tellName函數的區別:一個是打印field的值,而另一個是打印參數。
其實過程是這樣的:
1.
創建Son的時候先創建Father,而Father中的whoAmI是已經被Son覆蓋了,因此這里打印的name這個field是Son中的
field,而此時還沒有構造Son,因此Son中的name的值是null(這里即使是寫了String name =
"SON"也是沒有用的,因為父類沒有構造結束之前,這里是不會被執行的)。
2.Father在執行tellName的時候,傳遞的參數name是Father自身的name這個field值,這個值是已經被賦值為"FATHER"的,因此會打印出“Son's name is FATHER”
3.Father構造完畢后開始構造Son,這里的打印結果就可以按照常規方式來解釋了。