Thinking in Java 多态的缺陷:域与静态方法

来源:互联网 发布:ios判断网络状态 编辑:程序博客网 时间:2024/05/22 06:14

P157

一旦你了解了多态机制,可能就会开始认为所有事物都可以多态地发生。然而,只有普通的方法调用可以是多态的。例如,如果你直接访问某个域,这个访问就将在编译期进行解析,就像下面的示例所演示的:

//: polymorphism/FieldAccess.java// Direct field access is determined at compile time.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());  }} /* Output:sup.field = 0, sup.getField() = 1sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0*///:~

当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Super.field和Sub.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域;它自己的和它从Super处得到的。然而,在引用Sub中的field时所产生的默认域并非Super版本的field域。因此,为了得到Super.field,必须显式地指明super.field.

尽管这看起来好像会称为一个容易令人混淆的问题,但是在实践中,它实际上从来不会发生。首先,你通常会将所有的域都设置成private,因此不能直接访问它们,其副作用是只能调用方法来访问。另外,你可能不会对基类中的域和导出类中的域赋予相同的名字,因为这种做法容易令人混淆。

如果某个方法是静态的,它的行为就不具有多态性:

//: polymorphism/StaticPolymorphism.java// Static methods are not polymorphic.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());  }} /* Output:Base staticGet()Derived dynamicGet()*///:~

静态方法是与类,而并非与单个的对象相关联的。

0 0
原创粉丝点击