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)方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM