測試代碼以下: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
裏也有定義 a
,s.a
仍然用 SuperClass
的 a
. 在 SubClass.hello()
使用的 a
是哪一個類中定義的?變量
這是由於多態有以下一些限定:方法
SubClass.hello()
使用的 a
是哪一個類 SubClass
中定義的。雖然依據第1條的說明,實例變量不具備多態性,但若是經過子類的方法去訪問(如經過 SubClass.hello()
),它依然能夠被訪問到,只不過不那麼直接罷了。