物件繼承和物件變數參考轉型的關係

package variables_methods.snippets;

/**
*
* @author stephen.liu
*/
abstract class A {
abstract void a1();
void a2(){}
}

class B extends A {
void a1(){}
void a2(){}
}

class C extends B {void c1(){}}

public class Polymorphic {
public static void main(String[] args) {
A x = new B(); C y = new C();A z = new C();

}
}
what are four valid examples of polymorphic method calls?(Choose four.)
A.x.a2();
B.z.a2();
C.z.c1();
D.z.a1();
E.y.c1();
F.x.a1();

徹底征服SCJP 6 認證這本課本答案是ABDF,

但是我用netbeans撰寫的時候是E.y.c1();是對的,F.x.a1()是錯的!

而且它的解釋是這樣。以程式方面來看y.c1()是正確的呼叫方式,型別C類別的y變數只像C類別物件實體,呼叫C類別所實作的c1()函式,這是非常正確的呼叫作法,但選項E為何是錯的呢?因為此選項是錯再沒有用到多型的用法。這選項是個陷阱。

如果說沒用到多型用法而錯,那也應該是ABD是對的而已吧!因為F語法本身就有錯!
所以煩請高手代為解惑,謝謝!

今天(11/11)看到有人回覆說沒問題,我就再確認一次,真是詭異沒問題了,看來我有眼花的毛病了!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。