[問題] methods在多型跟繼承之間

看板java作者 (所失者寡所得者眾??)時間17年前 (2008/04/30 16:13), 編輯推噓2(205)
留言7則, 3人參與, 最新討論串1/1
下面是程式碼: class P { public void m(P p){ System.out.println("P::P"); } public void m(Q p){ System.out.println("P::Q"); }//這一行 public void m(R c){ System.out.println("P::R"); } } class Q extends P { public void m(P p){ System.out.println("Q::P"); } public void m(Q q){ System.out.println("Q::Q"); } public void m(R r){ System.out.println("Q::R"); } } class R extends Q { public void m(P p){ System.out.println("R::P"); } public void m(Q q){ System.out.println("R::Q"); } public void m(R r){ System.out.println("R::R"); } } public class Q3 { public static void main(String[] args) { P pp = new P(); Q qq = new Q(); R rr = new R(); P pq = qq; Q qr = rr; pp.m(qq); pq.m(pp); pq.m(qq); rr.m(pp); qq.m(pq); qq.m(qq); ((P) qq).m(qq); ((P) qq).m((Q) rr); } } 執行結果是 P::Q Q::P Q::Q R::P Q::P Q::Q Q::Q Q::Q 現在問題是 如果把"//這一行"的method給註解掉後 執行結果是 P::P Q::P Q::P //這邊 R::P Q::P Q::Q Q::P //這邊 Q::P 上面兩個"//這邊" 為什麼會是Q::P 而不是 Q::Q 勒???? 我想不出一個道理來 希望各位高手們幫忙解釋一下 謝謝摟 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.41.143

04/30 16:41, , 1F
pq.m(this);?
04/30 16:41, 1F

04/30 16:49, , 2F
不是的。pq.m(qq);呼叫到的因該是 Q物件中的第二個m()
04/30 16:49, 2F

04/30 16:52, , 3F
但是卻呼叫到物件Q中第一個m()。
04/30 16:52, 3F

04/30 18:19, , 4F
沒有Q所以它把Q當成P了
04/30 18:19, 4F

04/30 18:21, , 5F
還有用父類別宣告的變數不能呼叫子類別才定義的方法。
04/30 18:21, 5F

04/30 20:54, , 6F
那pq.m(pp);因該會是P::P阿 為何結果是Q::P
04/30 20:54, 6F

04/30 21:34, , 7F
override
04/30 21:34, 7F
文章代碼(AID): #1862eREG (java)