覆盖 Java 中的 属性

Override a property in Java

在Java中,我最近有几个项目使用了这样的设计模式:

public abstract class A {
 public abstract int getProperty();
}

public class B extends A {
 private static final int PROPERTY = 5;

 @Override
 public int getProperty() {
  return PROPERTY;
 }
}

然后我可以在 class A 的任何成员上调用抽象方法 getProperty()。然而,这似乎很笨拙——似乎应该有一些方法可以简单地覆盖 属性 本身,以避免在扩展 A 的每个 class 中重复 getProperty() 方法。

像这样:

public abstract class A {
 public static abstract int PROPERTY;
}

public class B extends A {
 @Override
 public static int PROPERTY = 5;
}

这样的事情可能吗?如果是这样,如何?否则,为什么不呢?

你不能 "override" 字段,因为只有方法可以有覆盖(并且它们不允许是静态的或私有的)。

你可以通过非抽象的方式实现你想要的效果,并为子类提供一个受保护的域来设置,像这样:

public abstract class A {
    protected int propValue = 5;
    public int getProperty() {
        return propValue;
    }
}

public class B extends A {
    public B() {
        propValue = 13;
    }
}

这个技巧让 A 的子类 "push" 将新值放入其超类的上下文中,获得类似于 "overriding" 的效果,而无需实际覆盖。