解决方案 »

  1. 运行的结果是:B and A
                                B and A
                                A and D
    解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
      

  2. B and A
    B and A
    A and D
    正确
      

  3. 继承结构:B继承A,C和D继承B
    执行结果是:
    B and A
    B and A
    A and D
    说明:
    B and A  这个不用说了,直接调用B.show(A);
    B and A  这个我也没理解,debug运行走的是B.show(A);但是为什么不走B.show(B obj)呢,着实没搞懂;
    A and D 这个很好理解,走的是B.show(D obj)方法,此方法是从A中继承过来的
      

  4. 谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?
      

  5. 谢谢~但是为啥a2.show(b)直接调用B.show(A)呢?
      


  6. 谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?多态的三要素:1,要有继承 2要有方法重写 3父类引用指向之类的对象。调用父类引用中被子类重写的方法show(),实际执行的是调用之类的show(),这就是多态的定义,不要问为什么,会用就行。父类A有个方法fun(),它的子类B1,B2,B3分别重写方法fun()。A a1=new B1();A a2=new B1();A a3=new B1();a1.fun(),a2.fun(),a3.fun()表现出不同的行为,这里a1,a2,a3都是父类引用对象,执行一个父类引用对象的方法fun(),却表现出不同的行为(分别是子类B1,B2,B3里面的fun()),这就体现出了多态。
      

  7. 谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?多态的三要素:1,要有继承 2要有方法重写 3父类引用指向之类的对象。调用父类引用中被子类重写的方法show(),实际执行的是调用之类的show(),这就是多态的定义,不要问为什么,会用就行。父类A有个方法fun(),它的子类B1,B2,B3分别重写方法fun()。A a1=new B1();A a2=new B1();A a3=new B1();a1.fun(),a2.fun(),a3.fun()表现出不同的行为,这里a1,a2,a3都是父类引用对象,执行一个父类引用对象的方法fun(),却表现出不同的行为(分别是子类B1,B2,B3里面的fun()),这就体现出了多态。不好意思写错了,应该是A a1=new B1();A a2=new B2();A a3=new B3();
      

  8. 我看懂了一点。
    因为a2的类型是A,所以a2永远只能调A中的方法及其子类的重写方法,子类的其他方法都是调不到的。就像接口一样,只能调接口方法,实现写再多其他别的方法都是不可见的。
      

  9. 谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?多态的三要素:1,要有继承 2要有方法重写 3父类引用指向之类的对象。调用父类引用中被子类重写的方法show(),实际执行的是调用之类的show(),这就是多态的定义,不要问为什么,会用就行。父类A有个方法fun(),它的子类B1,B2,B3分别重写方法fun()。A a1=new B1();A a2=new B1();A a3=new B1();a1.fun(),a2.fun(),a3.fun()表现出不同的行为,这里a1,a2,a3都是父类引用对象,执行一个父类引用对象的方法fun(),却表现出不同的行为(分别是子类B1,B2,B3里面的fun()),这就体现出了多态。不好意思写错了,应该是A a1=new B1();A a2=new B2();A a3=new B3();奥我重新理解了一下这段话:“父类型的引用可以指向子类型的对象,比如 Parent p = new Child();//Parent类型的引用指向Child类型的对象,因为子类就是父类(玫瑰是花)。指向谁就会调用谁的方法”,p调用的是Child类重写Parent类的方法。对吗?
      

  10. java不是说你 我说的是一楼
      

  11. 实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。 
      比如,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。
    同理,a2.show(c),c是类C的一个实例,C继承与B,于是到B中找有没有show(C obj)方法,没有找到,又去A中找,A中也没有。所以转到第三优先级this.show((super)O),O为C,(super)O为(super)C即B;即相当于是a2.show(b),又转到上面的过程,即输出结果也是“B and A”;
    同理:因为A中存在show(D obj)这个方法,所以输出结果是“A and D"
      

  12. 编译报错,a2.show(c)编译时报错,A类中没有show(C obj)的方法,a2在编译时是A类,A类中没有show(C obj)的方法,编译时报错
      

类似问题 »