---恢復內容開始---
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)方法