用Java覆盖属性

时间:2016-07-02 18:27:38

标签: java oop override abstract-class

在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;
 }
}

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

这样的事情:

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

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

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

1 个答案:

答案 0 :(得分:5)

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

您可以通过使方法非抽象,并为子类提供受保护的字段来实现您想要的效果,如下所示:

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

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

这个技巧可以让A的子类"推送"一个新的值进入他们的超类的上下文,得到的效果类似于"覆盖"没有实际覆盖。