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{}
public class test {
public static void main(String[] args) {
A a = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a.show(b));
System.out.println(a.show(c));
System.out.println(a.show(d));
}
b是b类型b对象,a是a类型b对象,a.show(b);不是引用的是b类型的show(B obj)方法吗
------解决思路----------------------
做了下实验,楼主问题主要原因如下:
(1)A类中有下列两个方法:
show(D obj);
show(A obj);
(2)B类中覆盖了A类的show(A obj)方法,并增加了个show(B obj)方法;
(3)当敲入如下客户端测试代码,执行步骤如下:
A a = new B();
B b = new B();
a.show(b);
1.首先,会先从父类A中寻找匹配的方法。
2.因为B,C都是A的子类,而父类A中没有指定B,C类型参数的方法,所有会匹配到A类型参数方法。
3.由于show(A obj)已被重写,所以执行结果为: B and A , B and A
4.当调用a.show(d)时,由于父类A中有指定的D类型参数方法,所以直接匹配,结果为:A and D
这里的问题是:
因为B类型是A类型的子类,所以在B类中新添加的show(B obj)方法并不会得到执行,因为它在父类A中没有定义show(B obj)方法,所以会一直匹配到父类型方法show(A obj)去。
---------------------不信你可以动手实验一下-----------------------
在class A 中添加如下方法:
public String show(B obj) {
return ("A and B ");
}
这样的话,a.show(b)的结果就会为:B and B ;
注意:这里a.show(c)的结果也会变成:B and B ;
因为 C类的直接父类是B类,假如没有B类型参数,才会向上匹配到A类型参数。