java 多态输出 问题求解

有如下代码:
public static void main(String[] args) {

    A a2 = new B();  
    B b = new B();  
    C c = new C();   
    D d = new D();   
    System.out.println(" 1:"+a2.show(b));    
    System.out.println(" 2:"+a2.show(c));    
    System.out.println(" 3:"+a2.show(d));    
    System.out.println(" 4:"+b.show(c));     
    System.out.println(" 5:"+b.show(d));  
}

static class A {  
    public String show(D obj){  
           return ("A and D");  
    }   
    public String show(A obj){  
           return ("A and A");  
    }   

}

static class B extends A{

public String show(B obj){

return ("B and B");

}

public String show(A obj){

return ("B and A");

}

}

static class C extends B{}

static class D extends B{}

运行后结果是:
1:B and A

2:B and A
3:A and D
4:B and B
5:A and D

小弟非常不理解这样的输入结果,望各位大神指教

同样不太懂,但是查了一下有一个帖子回答了,你可以看一下
http://ask.csdn.net/questions/250227

父类引用指向子类对象,如果父类方法被子类重写,调用的就是重写后的方法。这是虚拟方法调用。如果是字段,则还是以重写前的为准,不过这种重写字段的情况很少。

这个问题牵扯到向上转型,因为B向上转型为父类A,所以a2调用的方法第一步先指向了A类中的方法,如果A类中找不到会报错,
找到了Java内部还会查询子类中是否覆写了该方法,覆写了则实际调用执行的为子类B中的方法。
就该种情况而言,a2.show(b)和a2.show(c)先指向的为A类中的show(A obj),但B类覆写了该方法,实际调用执行的为B类中
的show(A obj),a2.show(d)指向A类中show(D obj)很好理解。因此 前3行的结果为
1:B and A
2:B and A
3:A and D
后面两行的结果很好理解,就是本质的调用苯本类中的方法而已,唯一涉及到的知识就是函数的重载的调用。我就不赘言了。

向上转型的问题 二楼 “天涯思情 ”大神解释的很清楚。但 有一点不是太明白, System.out.println(" 4:"+b.show(c)); 调用B 中的show()方法,参数没有C类型的,为什么会执行show(B b),而不会执行show(A a)呢, 希望大家讲解讲解