pitfall: fields and static methods

本文通过实例深入探讨了Java中字段访问与静态方法多态的常见陷阱。揭示了字段访问如何在子类中产生两个同名字段,以及静态方法为何不遵循多态原则。理解这些概念对于避免编程错误至关重要。

1. pitfall: fields example

// polymorphism/FieldAccess.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Direct field access is determined at compile time

class Super {
  public int field = 0; // [1]

  public int getField() {
    return field;
  }
}

class Sub extends Super {
  public int field = 1;

  @Override
  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() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField()
= 0
*/

In this example, different storage is allocated for Super.field and Sub.field . Thus, Sub actually contains two fields called field : its own and the one it gets from Super . However, the Super version is not the default that is produced when you refer to field in Sub. To get the Super field you must explicitly say super.field.

Although this seems like it could be a confusing issue, in practice it virtually never comes up.

when replace [1] to private int field = 0; the compiler message is:

OnJava8-Examples/polymorphism/FieldAccess.java:24: error: field has private access in Super
    return super.field;
                ^
OnJava8-Examples/polymorphism/FieldAccess.java:31: error: field has private access in Super
    System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
                                           ^
2 errors

2. pitfall: static methods example

// polymorphism/StaticPolymorphism.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// 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()";
  }

  @Override
  public String dynamicGet() {
    return "Derived dynamicGet()";
  }
}

public class StaticPolymorphism {
  public static void main(String[] args) {
    StaticSuper sup = new StaticSub(); // Upcast
    System.out.println(StaticSuper.staticGet());
    System.out.println(sup.dynamicGet());// Derived dynamicGet()
  }
}
/* Output:
Base staticGet()
Derived dynamicGet()
*/

static methods are associated with the class, and not the individual objects.

references:

1. On Java 8 - Bruce Eckel

2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/polymorphism/FieldAccess.java

3. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/polymorphism/StaticPolymorphism.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值