用Java覆盖属性

nho*_*er9 1 java oop abstract-class overriding

在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;
 }
}
Run Code Online (Sandbox Code Playgroud)

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

像这样的东西:

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

public class B extends A {
 @Override
 public static int PROPERTY = 5;
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 5

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

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

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

public class B extends A {
    public B() {
        propValue = 13;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个技巧让A子类将一个新值"推"到它们的超类的上下文中,使得效果类似于"覆盖"而没有实际覆盖.