(一)相关类
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...{}
(二)问题:以下输出结果是什么?
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)); ⑧
(三)答案
① 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
参见
http://blog.csdn.net/danielinbiti/article/details/44047007
多态是面向对象的一个特性。。。
首先,帮你验证了下
http://ideone.com/u5vIlt
这里的答案是对的。
其次,不要为了这个问题纠结。这个程序不但有方法重写,还有类型重载。即便是非常有经验的程序员,在阅读这种代码的时候也经常搞不清楚——这种代码根本就不应该搞清楚。
我猜你有疑惑的应该是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)方法
你的代码代码涉及两个概念,同一个类中方法名称相同但参数类型不同,这是方法重载;类子类有与父类相同的方法声明但实现不同,这个是重写。多态是建立在重写基础上的,最终调用的方法由真正的类型决定。