I'm not me? —— 多態的另外一個例子

按:我感受我出了一個還不錯的面試題~java

代碼以下:面試

SuperClass.javaide

public class SuperClass {
    int a = 3;

    public int getA() {
        return a;
    }
}

SubClass.java.net

public class SubClass extends SuperClass{
    int a = 4;

    @Override
    public int getA() {
        return a;
    }
}

Client.javacode

public class Client {
    public static void main(String[] args) {
        SuperClass s = new SubClass(); //!!! s 的編譯時類型是 SuperClass, 運行時類型是 SubClass
        System.out.println(s.a); // 3
        System.out.println(s.getA()); // 4
        System.out.println(s.a != s.getA()); // true
    }
}

Client 的幾個輸出語句的輸出結果寫在代碼註釋中了。其中,須要特別注意的是: s.a != s.getA()true! 這個初看有點讓人不解,s.a 怎麼會不等於自身?(I'm not me?) 出現這個狀況,正是**多態(Polymorphism)**的限定所決定的:對象

  • 對象的方法具備多態性,因此 s.getA() 訪問的是子類 SubClass 的方法 getA().
  • 對象的域(field)不具備多態性。s.a 訪問的是父類 SupperClassa, 爲3.
  • 經過對象的方法訪問對象的變量,它使變量_間接_地有了多態性. SubClass.getA() 中訪問的是 SubClass 的實例的變量 a, 因此爲4.

PS: 剛剛寫了個多態的例子,想了下,以爲比較麻煩,羅嗦,就改了一個簡化版如上。blog

相關文章
相關標籤/搜索