当前位置: 代码迷 >> J2EE >> 请问一个很经典的java多态有关问题
  详细解决方案

请问一个很经典的java多态有关问题

热度:12   发布时间:2016-04-17 23:08:56.0
请教一个很经典的java多态问题

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类型参数。