一旦瞭解多態機制,就可能開始認爲全部事物均可以多態的發生(在運行時才尋找對應的方法)。java
但須要注意的是隻有普通的方法調用是多態的。而域不是。域屬於誰的就是誰的。spa
例:code
先別看結果,請你們先推測一下輸出對象
package polymorphism; class Super { public int field = 0; public int getField() { return field; } } class Sub extends Super { public int field = 1; public int getField() { return field; } public int getSuperField() { return super.field; } } public class FieldAccess { public static void main(String[] args) { Super sup = new Sub(); // Upcast System.out.println("sup.field = " + sup.field + ", sup.getField()" + sup.getField()); Sub sub = new Sub(); System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField()); } }
結果是這樣的:get
sup.field = 0, sup.getField()1編譯器
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0編譯
這表示當Sub對象轉型爲Super引用時,任何域訪問操做都將由編譯器解析,所以不是多態的。在本例中子對象Sub包含兩個field的域,一個來自自己的,一個是從Super獲得的。ast
須要瞭解的是,通常這種狀況不會在實際工做中遇到,由於一般狀況下,域的權限都是private.class
即便是public的,名字也不會和父類中的相同,這樣很容易產生混淆。權限
本例主要是說明對域的訪問在編譯期進行,不會發生多態△△△。
例:
package polymorphism; class StaticSuper { public static String staticGet() { return "Base staticGet()"; } public String dynamicGet() { return "Base dynamicGet()"; } } class StaticSub extends StaticSuper { public static String staticGet() { return "Derived staticGet()"; } public String dynamicGet() { return "Derived dynamicGet()"; } } public class StaticPolymorphism { public static void main(String[] args) { StaticSuper sup = new StaticSub(); // Upcast System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); } }
結果是這樣的:
Base staticGet()
Derived dynamicGet()
能夠看到第一個方法是static的,是沒有多態行爲的。
著做權歸@kfh全部轉載請註明出處