小编典典

Java中final字段的继承?

java

当超类具有标记为final的字段但子类覆盖(隐藏?)此字段时,会发生什么?“最终”并没有阻止它,不是吗?我正在处理的特定示例是Building类,从中继承了各种建筑物。除其他事项外,每种类型的成本对于每个子类都应是最终成本,但是每种类型的建筑物应具有自己的成本。

编辑:从那以后,我意识到我不知道上面我在说什么。我真正想要的是成本的静态变量。但是,如果我在超类中声明这些静态变量,则它们对于超类是静态的,因此Subclass1.cost所引用的值与Superclass.cost或Subclass2.cost相同。我如何才能使每个子类都是静态的变量,而不必在每个类中声明它们。


阅读 498

收藏
2020-11-16

共1个答案

小编典典

final关键字,当应用到一个Java类的字段,无关与继承。相反,它表示在构造函数之外,无法重新分配该字段。

Java分别处理名称隐藏和覆盖。覆盖实际上是通过切换调用哪个函数来在运行时更改程序的可观察行为,而名称隐藏则通过更改要引用哪个字段的静态解释来更改程序。
final应用于覆盖仅适用于方法,因为Java中的字段不能被覆盖。final不幸的是,在这些不同的上下文中使用它有点令人困惑,并且无法防止字段的名称隐藏在子类中。

如果您希望建筑物具有不同的成本,则一种选择是采用一种覆盖的getCost方法,该方法在每个派生类中均以不同的方式覆盖。或者,您可以在基类中有一个存储费用的单个protectedprivate字段,然后让每个子类直接(如果为protected)或通过基类构造函数(如果为private)设置该字段。

希望这可以帮助!

2020-11-16