1. 程式人生 > >Java中關於繼承與多型的一道選擇題

Java中關於繼承與多型的一道選擇題

先上題目:

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()); }

這時候,就麻煩了。仔細分析。。

  1. 先觀察有沒有編譯問題。
  2. 最終c指向a,b實現了a,c繼承了a,自然根據傳遞性,c也實現了a,那麼a.show() 結果為C。
  3. 將a向下轉(強轉)為b後,就結束了,那麼b.show()還是沒動,應該是B。
  4. b指向c,根據lsp原則c.show()結果為C。
    最後結果選A。