Java中關於繼承與多型的一道選擇題
阿新 • • 發佈:2019-01-28
先上題目:
interface A {
public String show();
}
class B implements A {
public String show() {
return "B";
}
}
class C extends B {
public String show() {
return "C";
}
}
public class Test {
public static void main(String[] args) {
A a = new B();
B b = new C();
A c = new C();
System.out.println(a.show() + b.show() + c.show());
}
}
給出的選項
A.CBC
B:BCC
C:CCB
D:執行時丟擲異常
很明顯,根據繼承與多型的,lsp原則,答案為B。這時,增加main方法中條件,,如下
public static void main(String[] args) {
A a = new B();
B b = new C();
A c = new C();
c = b;
b = (B) a;
a = c;
System.out .println(a.show() + b.show() + c.show());
}
這時候,就麻煩了。仔細分析。。
- 先觀察有沒有編譯問題。
- 最終c指向a,b實現了a,c繼承了a,自然根據傳遞性,c也實現了a,那麼a.show() 結果為C。
- 將a向下轉(強轉)為b後,就結束了,那麼b.show()還是沒動,應該是B。
- b指向c,根據lsp原則c.show()結果為C。
最後結果選A。