一旦了解多态机制,就可能开始认为全部事物均可以多态的发生(在运行时才寻找对应的方法)。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全部转载请注明出处