用這題目吸引大家注意,請(qǐng)見諒!
以下代碼有些朋友可能會(huì)似曾熟識(shí),可能也算不上“原創(chuàng)”,請(qǐng)見諒!
不過,我出的這題,確定有點(diǎn)意思,考考大家。
/**
* 父類
* @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);
}
}
問題:當(dāng)執(zhí)行
Father who = new Son(); 時(shí),會(huì)輸出什么?
如果你去參加一個(gè)公司的筆試或面試時(shí)問了這么一道題,在沒有環(huán)境測(cè)試的情況下,你會(huì)猜測(cè)什么答案?
這個(gè)題目其實(shí)是一個(gè)小Trick,要注意whoAmI和tellName函數(shù)的區(qū)別:一個(gè)是打印field的值,而另一個(gè)是打印參數(shù)。
其實(shí)過程是這樣的:
1.
創(chuàng)建Son的時(shí)候先創(chuàng)建Father,而Father中的whoAmI是已經(jīng)被Son覆蓋了,因此這里打印的name這個(gè)field是Son中的
field,而此時(shí)還沒有構(gòu)造Son,因此Son中的name的值是null(這里即使是寫了String name =
"SON"也是沒有用的,因?yàn)楦割悰]有構(gòu)造結(jié)束之前,這里是不會(huì)被執(zhí)行的)。
2.Father在執(zhí)行tellName的時(shí)候,傳遞的參數(shù)name是Father自身的name這個(gè)field值,這個(gè)值是已經(jīng)被賦值為"FATHER"的,因此會(huì)打印出“Son's name is FATHER”
3.Father構(gòu)造完畢后開始構(gòu)造Son,這里的打印結(jié)果就可以按照常規(guī)方式來解釋了。