当前位置: 首页 > 面试题库 >

Java中final字段的继承?

芮琛
2023-03-14
问题内容

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

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


问题答案:

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

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

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

希望这可以帮助!



 类似资料:
  • 问题内容: 我无法理解以下输出。 我不知道为什么输出为10,我认为该行创建了B类的新实例,我认为结果应为20 为什么这样工作..请解释。 问题答案: 首先,请参见 隐藏字段 (添加了重点) 在一个类中,与超 类中的字段 同名的字段会 隐藏超类的字段 ,即使它们的类型不同 换句话说,这是不是“遗产”,因为你实际上隐藏的背后的,和你正在使用的参考对象,所以你得到它的领域。如果这样做了,您将看到预期的效

  • 我试图通过反射在Java17覆盖非静态最终字段的值。 据我所知,从Java 12及以上版本开始,你就不能再做下面这一招了: 当我在Java 17中运行时,会引发以下异常: “bar”的值保持不变。 对于Java的新版本,是否有等效的方法覆盖最终字段?在谷歌中的快速搜索没有产生与上述解决方案不同的任何结果。我唯一学到的是,覆盖静态最终字段是不可能的,而通过反射仍然可以覆盖非静态最终字段,但我找不到方

  • 问题内容: 在Java中,要声明一个常量,您可以执行以下操作: Kotlin中的等效物是什么? 问题答案: 根据Kotlin 文档,这是等效的: 用法: 这也是静态的final属性(带有getter的字段): 最后这是静态的final字段:

  • 我在groovy/spock中测试了一个java类。java类有最后一个字段: 我想测试一个方法是否使用这个记录器,最好是使用模拟。问题是这个字段是最终的,所以我不能直接设置它。我知道有一些变通方法,比如: 修改ield.set字段field.get 但这些都是可怕的黑客。有没有更好的方法?

  • 从实践中的Java并发性来看: 当一个字段被声明为volatile时,编译器和运行时会注意到这个变量是共享的,对它的操作不应该与其他内存操作一起重新排序。易失性变量不缓存在寄存器或缓存中,在这些寄存器或缓存中,它们对其他处理器隐藏,因此读取易失性变量总是返回任何线程最近的写入。(第25页) 和 Final字段不能修改(尽管它们引用的对象可以修改,如果它们是可变的),但它们在Java内存模型下也有特

  • 问题内容: 我找到了一种通过来获取继承成员并通过来获得 ; 私有成员的方法,但是我正在寻找私有的继承字段。我怎样才能做到这一点? 问题答案: 这应该演示如何解决它: (或Class.getDeclaredFields用于所有字段的数组。) 输出: