java - Java中final字段的继承?

标签 java inheritance static

当一个父类(super class)有一个标记为 final 的字段,但一个子类覆盖(隐藏?)这个字段时会发生什么? “final ”并不能阻止这一切,是吗? 我正在处理的具体示例是一个 Building 类,不同类型的建筑物继承自该类。每种类型的成本,除其他事项外,应该是每个子类的最终成本,但每种类型的建筑都应该有自己的成本。

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

最佳答案

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

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

如果您希望建筑物具有不同的成本,一种选择是重写 getCost 方法,该方法在每个派生类中被不同地重写。或者,您可以在存储成本的基类中有一个 protectedprivate 字段,然后让每个子类直接设置此字段(如果这是 protected) 或通过基类构造函数(如果此字段是 private)。

希望这对您有所帮助!

关于java - Java中final字段的继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799018/

相关文章:

java - 我的编译器无法读取某些类

java - 装饰器模式,子类通过其他子类运行以获得行为?

c# - 静态索引器?

header 中定义的静态类方法中的 C++ 静态变量

java - Android:单击按钮时切换相机

java - 如何使用 Spring Boot 使用 JSON 对象数组?

java - 在 ListView 中显示数据库

java - 是否可以将抽象方法的返回类型设置为与类相同?

java - 将 log4j 与继承的类一起使用

android - 将静态变量保留更长的时间 - Android