`

陷阱:域与静态方法

 
阅读更多

只有普通的方法调用可以是多态的。


1.直接访问某个域,这个访问将在编译期进行解析。

示例:

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继承来的。

 

 

2.如果某个方法是静态的,它的行为也不具有多态性。

示例:

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()
*/

 因为静态方法是和类相关联的,而不是某个对象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics