inf*_*ous 3 java inheritance information-hiding
我知道孩子不能降低非静态方法的可视性,而且我理解为什么会这样。
但是,我读过“可以通过重新声明静态方法来隐藏它”。但是我不明白如何用Java实现。
这真的有可能吗?如果是,该如何做(代码示例),为什么要引入它(这似乎与不降低接口可见性的原理相矛盾)?
简短的答案是:不,不可能。您混淆了一些术语。隐藏与可访问性无关(这是您真正要问的,而不是可见性,它与范围和阴影有关,在Java语言规范(JLS)的第6章中进行了讨论)。
现在为更长的答案。术语“ 覆盖”适用于实例方法,而术语“ 隐藏”适用于class(static)方法。在Java教程主题覆盖和隐藏方法中:
隐藏静态方法和覆盖实例方法之间的区别具有重要意义:
- 被调用的重写实例方法的版本是子类中的版本。
- 被调用的隐藏静态方法的版本取决于是从超类还是从子类调用。
这里的其他一些答案提供了有关方法隐藏的错误示例,因此让我们回到JLS,这一次是§8.4.8:
方法会逐个签名地被覆盖或隐藏。
也就是说,要覆盖或隐藏父类中的方法,子类必须定义一个具有相同签名的方法- 基本上,相同数量和类型的参数(尽管泛型和类型擦除使规则比之复杂一些) 。还有关于返回类型和throws子句的规则,但这些规则似乎与该问题无关。
请注意,可以在子类中具有相同的定义的方法名作为在父类(或者在实现的接口)的方法,但具有不同数量或类型的参数。在这种情况下,您将重载方法名称,而不会覆盖或隐藏任何内容。子类方法是一种新方法,几乎与继承的方法无关。(当编译器必须将方法与方法调用匹配时会发生交互,仅此而已。)
现在您的问题是:术语可访问性和隐藏(以及可见性)是Java中的独立概念。就像您所说的,“原理”是子类根本无法减少继承方法的可访问性。无论您是重写实例方法还是隐藏类方法,这都适用。从JLS§8.4.8.3开始:
覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示:
如果覆盖或隐藏方法是
public,则覆盖或隐藏方法必须是public; 否则,将发生编译时错误。如果覆盖或隐藏方法是
protected,则覆盖或隐藏方法必须是protected或public; 否则,将发生编译时错误。如果覆盖或隐藏方法具有默认(包)访问权限,则覆盖或隐藏方法不得为
private; 否则,将发生编译时错误。
总而言之,static可以隐藏方法的事实与更改方法的可访问性无关。
| 归档时间: |
|
| 查看次数: |
1008 次 |
| 最近记录: |