2 lauray lauray_ 于 2016.01.21 14:50 提问

求解释多态原理,下面的问题和答案已经把我弄懵了,求大神帮忙

(一)相关类

class A ...{

public String show(D obj)...{

return ("A and D");

}

public String show(A obj)...{

return ("A and A");

}

}

class B extends A...{

public String show(B obj)...{

return ("B and B");

}

public String show(A obj)...{

return ("B and A");

}

}

class C extends B...{}

class D extends B...{}


(二)问题:以下输出结果是什么?

A a1 = new A();

A a2 = new B();

B b = new B();

C c = new C();

D d = new D();

System.out.println(a1.show(b)); ①

System.out.println(a1.show(c)); ②

System.out.println(a1.show(d)); ③

System.out.println(a2.show(b)); ④

System.out.println(a2.show(c)); ⑤

System.out.println(a2.show(d)); ⑥

System.out.println(b.show(b)); ⑦

System.out.println(b.show(c)); ⑧

System.out.println(b.show(d)); ⑨


(三)答案

① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D

6个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.01.21 15:20
enpterexpress
enpterexpress   2016.01.21 15:26
Mr_dsw
Mr_dsw   Ds   Rxr 2016.01.21 15:36

多态是面向对象的一个特性。。。

caozhy
caozhy   Ds   Rxr 2016.01.21 16:19

首先,帮你验证了下
http://ideone.com/u5vIlt
这里的答案是对的。

其次,不要为了这个问题纠结。这个程序不但有方法重写,还有类型重载。即便是非常有经验的程序员,在阅读这种代码的时候也经常搞不清楚——这种代码根本就不应该搞清楚。

fvxiaoyi
fvxiaoyi   2016.01.21 16:47

我猜你有疑惑的应该是5,8
5. A a2 = new B(); B继承A, 声明一个A类型的引用a2 指向一个B类型的实例,这个时候B的实例只能当成A来用,A里面只有show(A a)和show(D d)
而show(A a)被 子类B重写,实际调用的是B的show(A a),a2.show(c) 传入参数是一个C类型的,所以只能调用show(A a)
8. B类型有show(A a)和show(B b) ,b.show(c),根据重载的最近匹配原则,c向上转型一次匹配到B ,所以会调用show(B b)方法

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.21 17:38
 你的代码代码涉及两个概念,同一个类中方法名称相同但参数类型不同,这是方法重载;类子类有与父类相同的方法声明但实现不同,这个是重写。多态是建立在重写基础上的,最终调用的方法由真正的类型决定。
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!