超类中的私有final可以被覆盖吗?

Posted

技术标签:

【中文标题】超类中的私有final可以被覆盖吗?【英文标题】:private final in superclass can be overridden? 【发布时间】:2014-02-21 00:24:26 【问题描述】:

哪三个陈述是正确的? (选择三项。)

A.当且仅当 X 是类 X 中的 final 方法 摘要。

B. X 类中的受保护方法可以被 十。

C.私有静态方法只能在其他静态方法中调用 X 类中的方法。

D.类 X 中的非静态公共 final 方法可以在 X 的任何子类。

E.类 X 中的公共静态方法可以由 X 的子类调用 没有明确引用 X 类。

F。与类中的私有 final 方法具有相同签名的方法 X 可以在 X 的子类中实现。

G.类 X 中的受保护方法可以被 X 的子类覆盖 仅当子类与 X 在同一个包中时。

这个问题来自 SCJP。答案是 BEF

我了解 BE,但 F 说该方法是“私有 final”,那么子类如何覆盖此方法,因为它被定义为 final 和私有方法。

请清除F点。

【问题讨论】:

F 没有说任何关于覆盖... final 不能被覆盖。此外,它的真正含义不是被覆盖 non-static, non-final 添加到 B 使其更正确! 【参考方案1】:

答案 F 不是覆盖的示例,它是方法范围的示例。在一个类中声明为private 的方法对该类的子类不可见,因此没有重叠;子类在超类中看不到它可以覆盖的方法。子类有自己的方法void foo(int),完全不知道超类的private void foo(int)

【讨论】:

这不是“范围”,而是“可见性”。 “范围”由. 确定 @EJP 它既不可见也不超出范围,因此可以复制超类的 private final 方法。见docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3【参考方案2】:

我了解 BE,但 F 说该方法是“私有 final”,那么子类如何覆盖此方法,因为它被定义为 final 和私有方法。

这个问题没有提到任何关于覆盖的内容。因为私有方法只存在于该类的上下文中,所以它不参与覆盖。你不能覆盖私有方法,因为私有方法在定义它们的类之外是不可见的。

另一种看待方法是,它们是两个不相关的方法,它们的签名相同纯属巧合。

因为子类中的私有方法不会覆盖超类中的私有方法,所以final 关键字无效。

【讨论】:

我知道这只是一个 Java 测试问题,但是在超类中拥有一个与私有方法具有相同名称和签名的方法是一种不好的做法。导致将来更改父类方法的可见性,可能会导致问题(然后它将变得覆盖!)。 @AmirPashazadeh 不一定。拥有private 成员的全部意义在于子类不应该知道该成员的存在。在最常见的版本控制方案major.minor.micro 中,添加类似这样的可见方法会导致次要版本增加,并且次要版本升级预计需要更改库中子类或实现类型的类。跨度>

以上是关于超类中的私有final可以被覆盖吗?的主要内容,如果未能解决你的问题,请参考以下文章

在java中,我们可以通过传递超类方法中使用的参数的子类来覆盖方法吗?

Java中的覆盖和隐藏以及final关键字

父类中的方法被覆盖以及子类调用父类覆盖的方法

Swift 错误 - 方法不覆盖其超类中的任何方法

覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法

方法没有覆盖超类中的任何函数(覆盖 func collectionView)[重复]