Java多态面试题案例几解题思路

---恢复内容开始---

Java多态面试题案例几解题思路

这道题是来自别人,先开始看到题很懵,后来有自己的思路:

  1 class A
  2 
  3 {
  4 
  5         public String show(D obj){
  6 
  7                return ("A and D");
  8 
  9         }
 10 
 11         public String show(A obj){
 12 
 13                return ("A and A");
 14 
 15         }
 16 
 17 }
 18 
 19 class B extends A
 20 
 21 {
 22 
 23         public String show(B obj){
 24 
 25                return ("B and B");
 26 
 27         }
 28 
 29         public String show(A obj){
 30 
 31                return ("B and A");
 32 
 33         }
 34 
 35 }
 36 
 37 class C extends B{}
 38 
 39 class D extends B{}
 40 
 41 class E
 42 
 43 {
 44 
 45       public static void main(String [] args)
 46 
 47      {
 48 
 49        A a1 = new A();
 50 
 51        A a2 = new B();
 52 
 53        B b = new B();
 54 
 55        C c = new C();
 56 
 57        D d = new D();
 58 
 59        System.out.println(a1.show(b));   //
 60 
 61        System.out.println(a1.show(c));   //
 62 
 63        System.out.println(a1.show(d));   //
 64 
 65        System.out.println(a2.show(b));   //
 66 
 67        System.out.println(a2.show(c));   //
 68 
 69        System.out.println(a2.show(d));  //
 70 
 71        System.out.println(b.show(b));    //
 72 
 73        System.out.println(b.show(c));    //
 74 
 75        System.out.println(b.show(d));    //
 76 
 77       }
 78 
 79 }
 80 
 81 (三)答案
 82 
 83 
 84 
 85              ①   A and A
 86 
 87              ②   A and A
 88 
 89              ③   A and D
 90 
 91              ④   B and A
 92 
 93              ⑤   B and A
 94 
 95              ⑥   A and D
 96 
 97              ⑦   B and B
 98 
 99              ⑧   B and B
100 
101              ⑨   A and D

思路:

解题口诀:

  • 成员变量:编译看左,运行看左(因为无法重写);

  • 成员方法:编译看左,运行看右(因为普通成员方法可以重写,变量不可以);

  • 静态方法:编译看左,运行看左(因为属于类);

  第一个:在A类中找show(B),然而没有B类对象作为参数方法,就找B的上个类,就 找到A类中有一个show(A)方法,所以是AA

  第二个:在A类中找show(C),然而没有C类对象作为参数方法,但是A类 为C 的父类的父类,所以打印AA

  第三个:因为其中有D类对象作为参数的方法,所以输出AD

  第四个:父类引用指向子类对象,首先调用的是 对象的方法 也就是B类中的,又因为B类中

向上转型,它只能访问父类中拥有的方法和属性,而对于不存在的方法,不能使用,意思就是只能使用重写的方法或者父类的方法。所以是BA;

  第五个:虽然 C类继承B类 ,但是只能调用父类中存在的方法,没有以C类对象作为参数的方法,所以只能将C类作为A类,所以也是BA

  第六个:因为父类中 直接有D作为参数的方法,所以 AD

  第七个:调用B类中以B类对象所谓参数的方法,所以BB

  第八个: 因为A B C 类中都没有 以C类对象作为参数的方法,所以C类变为B类,在B类中有 以B类作为参数的方法,(注:如果这点还找不到的话,就会将C类看做A类)并且执行B类的 BA, 为什么不是AA呢 因为覆盖掉了 

  第九个:以D 对象作为参数的方法 存在,所以执行A类的show(D)方法

原文地址:https://www.cnblogs.com/yanpingping/p/10538561.html