1.1 域的访问无多态
一旦了解多态机制,就可能开始认为所有事物都可以多态的发生(在运行时才寻找对应的方法)。
但需要注意的是只有普通的方法调用是多态的。而域不是。域属于谁的就是谁的。
例:
先别看结果,请大家先推测一下输出
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());
}
}
结果是这样的:
sup.field = 0, sup.getField()1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
这表示当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中子对象Sub包含两个field的域,一个来自本身的,一个是从Super得到的。
需要了解的是,一般这种情况不会在实际工作中遇到,因为通常情况下,域的权限都是private.
即使是public的,名字也不会和父类中的相同,这样很容易产生混淆。
本例主要是说明对域的访问在编译期进行,不会发生多态△△△。
1.2 静态方法不具有多态
例:
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所有转载请注明出处