Who am I? —— Java 多態特性一例

測試代碼以下:java

SuperClass.javaide

public class SuperClass {
    public String a = "from super class";

    public void hello() {
        System.out.println(a);
    }
}

SubClass.java測試

public class SubClass extends SuperClass {
    public int a = 3;

    @Override
    public void hello() {
        System.out.println(a);
    }
}

Client.javacode

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

上面的代碼中,SubClass 覆蓋了SuperClass 的 field a and its method hello(). Client 的輸出結果會是什麼呢?對象

運行代碼,得以下結果:it

3
from super class編譯

因而可知,class

  • s.hello() 執行了 SubClass.hello() 方法
  • s.a 訪問了 SuperClass.a.

初看讓人不解,這個 s訪問的內容,SubClass 中都有定義,但爲什麼 SubClass 仍是 SuperClass 都被它調用了呢?即SubClass 裏也有定義 as.a 仍然用 SuperClassa. 在 SubClass.hello() 使用的 a 是哪一個類中定義的?變量

這是由於多態有以下一些限定:方法

  1. 對象的實例變量不具備多態性。具有多態性的,只有實例的方法。因此訪問實例變量,依據其編譯時類型訪問。
  2. SubClass.hello() 使用的 a 是哪一個類 SubClass 中定義的。雖然依據第1條的說明,實例變量不具備多態性,但若是經過子類的方法去訪問(如經過 SubClass.hello()),它依然能夠被訪問到,只不過不那麼直接罷了。
相關文章
相關標籤/搜索