BenPhillip 2016-04-16 16:06 采纳率: 100%
浏览 1900
已采纳

JAVA 多态遇到的题目,求解释

特别是a2.show( )输出的结果不理解。求大神指点第一次提问

  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(A obj){
        return "b and a";
    }   
    public String show(B obj){
        return "b and b";
    }
}
class C extends B{}
class D extends B{}
public class Test1{
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));
}
}
  • 写回答

1条回答 默认 最新

  • 秦大圣 2016-04-16 17:34
    关注

    图片说明

     a2.show(b): b and a
    a2.show(c): b and a
    a2.show(d): a and d
    

    首先看着内存的布局图理解,首先a2的实在是一个对象B,但是由于a2是当作A来new的,所以a2指向的只是B中的A,它看不到B的方法的,
    对于传入一个b来说,b是B的一个实例,我们看A中show方法的参数没有是B的,由于B是一个A,所以找父类,当成一个A传进去,注意,我们new的时候,new出来的实质是个B,B对A中的方法show(A)方法进行了重写(此时B有三个方法),所以直接调用B的show(A)方法,打印出“b and a",
    第二第三个类似,只有内存布局画出来了,就好理解了!比如第二个c也是当成A传进去的(c是一个A),d直接传进去,A中有方法对应,只要第一个理解了,其他都是一样的!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?