public class Polymorphism {public static void main(String[] args) {
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));
}
}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{}

解决方案 »

  1.   

    http://blog.csdn.net/java_pengjin/article/details/6635317
    看看这个
      

  2.   

    A的show(D d)和show(A a)是方法重载,B的show(B b)和show(A a)也是方法重载,当方法调用的时候,会从下往上匹配参数最精确的方法。A的show(A a)和B的show(A a)是方法重写,当方法调用的时候,会根据当前调用方法的对象是A实例还是B实例来调用相应的方法
    所以
    System.out.println(a1.show(b)); //调用A的show(A a)方法 //调用a1实例的方法
    System.out.println(a1.show(c)); //调用A的show(A a)方法
    System.out.println(a1.show(d)); //调用A的show(D d)方法 //匹配最精确的方法
    System.out.println(a2.show(b)); //调用B的show(B b)方法 //匹配最精确
    System.out.println(a2.show(c)); //调用B的show(A a)方法 //调用a2实例(也就是B对象)的方法
    System.out.println(a2.show(d)); //调用A的show(D d)方法 //B继承A,所以B有show(D d)方法,匹配最精确
    System.out.println(b.show(b)); //调用B的show(B b)方法
    System.out.println(b.show(c)); //调用B的show(A a)方法 //b实例也就是B对象的方法
    System.out.println(b.show(d)); //调用A的show(D d)方法 //B继承A,所以B有show(D d)方法,匹配最精确
      

  3.   

    System.out.println(a1.show(b));//调用A的show(A obj),D类型是B的子类,无法匹配,向上找最匹配的A
    System.out.println(a1.show(c));//同上,不可能匹配D,只能是A
    System.out.println(a1.show(d));//匹配到D了,调用A的show(D obj)
    System.out.println(a2.show(b));//BA,没想明白
    System.out.println(a2.show(c));//BA,没想明白
    System.out.println(a2.show(d));//A的show(D obj),B中未重写该函数,找到继承下来的最匹配的D
    System.out.println(b.show(b));//B中重写的最匹配的show(B obj)
    System.out.println(b.show(c));//C类型向上找,B中重写的最匹配的show(B obj)
    System.out.println(b.show(d));//同a2调用
      

  4.   

    A and A 
    A and A
    A and D 
    B and B 
    B and B 
    B and B 
    B and B 
    B and B 
    B and B 这样嘛?
      

  5.   

    A and D
    A and D
    A and D
    B and B
    B and B
    A and D
    B and B
    B and B
    A and D
      

  6.   

    看串了,写错了
    A and A
    A and A
    A and D
    B and B
    B and B
    A and D
    B and B
    B and B
    A and D
      

  7.   

    不懂……为什么 a2.show(b) 结果是 B and A
      

  8.   

    晕 原来a2是A类型的我说咋不对头
    System.out.println(a2.show(b));//这个只会找A中的方法,如果B重写了则找B的,这里找到最匹配的B中的show(B)
    System.out.println(a2.show(c));//同上面的,从C类型往上找找到最匹配的B类型的
      

  9.   

    通常使用多态的话,子类应该覆盖父类的方法,而且是多个子类继承与同一个父类,当不同的子类实例们调用那个覆盖的方法时才能体现出多态(那些实例一定要用父类型声明,子类型创建的形式才行)。你这里就一个能体现多态的机会,就是A a2 = new B();可是却没有调用过a2.show(a1);你这里绕来绕去全是重载啊。
      

  10.   

    给你该了一下,运行看看什么叫多态吧
    public class Polymorphism {public static void main(String[] args) {
    A a = new A();
    A b = new B();
    A c = new C();
    A d = new D();
    System.out.println(b.show(a));
    System.out.println(c.show(a));
    System.out.println(d.show(a));
    }
    }class A{
    public String show(A obj){
    return("A and A");
    }
    }class B extends A{
    public String show(A obj){
    return("B and B");
    }
    }class C extends A{
    public String show(A obj){
    return("C and C");
    }
    }class D extends A{
    public String show(A obj){
    return("D and D");
    }
    }
     
      

  11.   

    ...越说越糊涂了,多态就是父类引用指向子类对象
    而且看你上面说的楼主只有一处用到多态,其实还有些你没有看到
    public String show(B obj){
    return("B and B");
    }
    public String show(A obj){
    return("B and A");
    }
    像这些方法传了一个A的子类或者B的子类的对象,也叫多态
      

  12.   


    糊涂了,忽略了一些细节,只考虑运行期,没有考虑编译期了System.out.println(a1.show(b)); //调用A的show(A a)方法 //调用a1实例的方法
    System.out.println(a1.show(c)); //调用A的show(A a)方法
    System.out.println(a1.show(d)); //调用A的show(D d)方法 //匹配最精确的方法System.out.println(a2.show(b)); //调用B的show(A a)方法 //编译期a2是A类型,所以编译器会查找A类最精确匹配的方法show(A a),运行期,a2指向B实例,所以实际调用B实例的show(A a)方法
    System.out.println(a2.show(c)); //调用B的show(A a)方法 //理由同上System.out.println(a2.show(d)); //调用A的show(D d)方法 //编译期决定调用方法是A的show(D d),运行期调用B实例的方法,B继承A,所以B有show(D d)方法
    System.out.println(b.show(b)); //调用B的show(B b)方法System.out.println(b.show(c)); //调用B的show(B b)方法 //b是B实例,参数也是c也是B的子类,匹配最精确方法System.out.println(b.show(d)); //调用A的show(D d)方法 //B继承A,所以B有show(D d)方法,匹配最精确