//B.java
class A
{
protected void hello(C c){
System.out.println("HelloA");
}

}class C
{
}class D extends C
{
}public class B extends A
{
protected void hello(D d){
System.out.println("Hello B-1");
}

protected void hello(C c){
System.out.println("Hello B-2");
}

public static void main(String[] args)
{
D d = new D();
C c = d;

A a = new B();
a.hello(c);    //输出为“Hello B-2”
a.hello(d);    //输出为“Hello B-2”
}
}为何执行“a.hello(d)”会输出"protected void hello(C c)"定义的结果??
我的JDK版本为1.5,请高人指点一下。

解决方案 »

  1.   

    B 是A的子类么
    动态绑定,自然会调用B的方法,尽管定义的时候是A a = new B();
      

  2.   

    俺的理解是 
    D是C 所以调用的时候把D和C是一样的,而C做为超类,有更大兼容性,所以应该先调用protected void hello(C c)
      

  3.   

    这个题有意思,一开始我的设想是会执行两遍 protected void hello(D d)呢, 看来理解还是不够深刻.
      

  4.   

    只覆写了protected void hello(C c)
    所议会调用 B.hello(C c)
      

  5.   

    B 是A的子类,protected void hello(C c)是B类重载A类的方法,所以他都会调用B类的protected void hello(C c)方法
      

  6.   

    俺的以上见解纯属扯蛋, ahFaye 说的对啊.
      

  7.   

    覆写的定义是 参数完全相同
    所谓完全相同 是指getClass()是一样的 
    D extend C   getClass()不同 所以protected void hello(D d)不是覆写不晓得说的对不对
      

  8.   

    刚才的C 和 D其实就是一个对象啊, 所以getClass()的结果应该是一样的. 完全相同,应该是句柄相同才可以.
      

  9.   

    我又试了一下,在A中也写了一个hello(D d)方法, 再重新调用的时候就分别调用了B中的两个方法.
    看来方法的重载和重写的含义用这个问题可以比较明白直观的体现.
      

  10.   

    to ahFaye:
    按照阁下的说法:
    ”只覆写了protected void hello(C c)
    所议会调用 B.hello(C c)"我又试了一下:
    在A类中加入如下代码:
    protected void hello(D d){
    System.out.println("HelloA2");
    }这样似乎就是在B中也将hello(D d)覆写了,
    可是执行结果依旧是“Hello B-2“,也就是说仍然调用的B.Hello(C c)。为何明明有类型更匹配的参数,而JAVA偏偏视而不见呢????
    谢谢楼上各位热心的回复,可是截至目前我还是不明白。。~!
      

  11.   

    to  pauliuyou(paul):
    兄弟确信A中加入hello(D d)方法后结果会有变化????
    我的不行。。
      

  12.   

    我加入了 hello(D d)方法,确实发生了变化, 我的jdk是1.5