大家好,今天看到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{} (二)问题:以下输出结果是什么? 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));     ⑨ (本文来自CSDN博客,http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx) 这里感谢原创作者(三)答案              ①   A and A
              ②   A and A
              ③   A and D
              ④   B and A
              ⑤   B and A
              ⑥   A and D
              ⑦   B and B
              ⑧   B and B
              ⑨   A and D我对本题的4,5搞不清楚,按照理论确实应该是这个答案,可是我的结果:
              ①A and A
              ②A and A
              ③A and D
              ④A and A
              ⑤A and A
              ⑥A and D
              ⑦B and B
              ⑧B and B
              ⑨A and D希望大家多多参与,分数可以再加!

解决方案 »

  1.   

    请参照抽象工厂模式
    head first
      

  2.   

    你那AA结果是有问题的,因为a2真是类型是B,而B里面有一个方法把父类的给覆盖掉了
    然而
    比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),
    为什么这里要把(super)o呢,看不懂,而不是show(o)?
      

  3.   


    有个优先级的
    貌似是固定的
        好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
    所以问题就“这样”解决了
      

  4.   


    确实有问题,可是我在eclipse上执行就是我的这个结果。难道eclipse有问题?
    博客中的优先级是“主人”自己总结的,我也不明白为什么会那样,
    感谢兄弟回答
      

  5.   

    他那总结的结果有点疑问
    A a=new B()
    首先调用子类的B的方法,如果B中无对应方法就执行父类的方法,已测试
    然后show里面的参数问题的话
    show(c)
    b和c则先找他对应的最高级父类类型的参数(Object 类型除外,试过 的)
    他们你的最高级父类是A
    那就是B AND A了
      

  6.   

    你确定你定义的a2是
    A a2 = new B(); ?
    是的话
    再怎么执行也会先调用B里面对应的方法
    子类方法能把父类方法覆盖掉的
      

  7.   

    A a2 = new B();这句话的意思是a2这个父类对象指向子类B对象的引用。a2.show(b)的意思是调用A类中的show (B obj)方法,因为不存在这个方法,所以向上转型,找show(A obj)方法,存在;但是B类重写了这个方法,因此调用子类的show(A obj)方法。所以从这个意义上讲,父类可以调用子类的方法,什么意思?调用子类重写的方法!试想,如果子类有的方法,而父类没有,父类能调用吗?
      

  8.   

    sean1203 谢谢你的帮助!我在程序中写成了这样:A a2 = new A();导致我程序运行结果和我们理论结果不同。
      

  9.   

    sean1203  justinavril 感谢你们的帮助问题解决,接分
      

  10.   


    关于这位兄弟所说个人认为应该直接就到B里面找show方法,而不应该从A里面找,因为现在这个引用看不到A,只看得到B里面的方法
      

  11.   

    由于结贴时间过早,dong502,t2xingzhe 没有给上分数,不过依然感谢你们的支持
      

  12.   

    这个不错,我也困惑过!呵呵!依然困惑ing!