qq_41812457 2019-09-04 12:20 采纳率: 100%
浏览 267
已采纳

关于java 继承链方法调用问题

public class PolymorphismTest {
     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 static void main(String[] args) {
            A a1 = new PolymorphismTest().new A();
            A a2 = new PolymorphismTest().new B();
            B b = new PolymorphismTest().new B();
            C c = new PolymorphismTest().new C();
            D d = new PolymorphismTest().new D();

            System.out.println("1--" + a1.show(b));
            System.out.println("2--" + a1.show(c));
            System.out.println("3--" + a1.show(d));
            System.out.println("4--" + a2.show(b));
            System.out.println("5--" + a2.show(c));
            System.out.println("6--" + a2.show(d));
            System.out.println("7--" + b.show(b));
            System.out.println("8--" + b.show(c));
            System.out.println("9--" + b.show(d));     
            System.out.println("10--" + a2.show(a1));
        }

}

最后输出
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
10--B and A

想问下第4与第5条结果为啥不是B and B

  • 写回答

3条回答 默认 最新

  • IT林跑跑 2019-09-04 16:37
    关注

    玩多态把自己玩蒙了

    public class PolymorphismTest {
     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 static void main(String[] args) {
    
        A a2 = new PolymorphismTest().new B();
        B b = new PolymorphismTest().new B();
        C c = new PolymorphismTest().new C();
    
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
    
      }
    
    }
    

    对于A中有如下两个方法

      public String show(D obj);
      public String show(A obj);
    

    对于B中有如下两个方法

      public String show(B obj);
      public String show(A obj);
    

    那你这里a2编译时是A,运行时是B。

    A a2 = new PolymorphismTest().new B();
    

    那么对于B中的两个方法,将覆盖A中的就只有

      public String show(A obj);
    

    另外一个通过A的实例根本调用不到

      public String show(B obj);
    

    也就是运行时A中的两个方法是

      public String show(D obj); // A的
      public String show(A obj); // B覆盖A的
    

    当你调用下面的两个方法

      System.out.println("4--" + a2.show(b));
      System.out.println("5--" + a2.show(c));
    

    那当然就是调用到

      public String show(A obj); // B覆盖A的
    

    这就等于你

      Object obj = new Object();
      Object a = new A(); // A里面有show()方法
      // a.show(); // 根本调不到
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页
  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中
  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态