为啥Java限制隐藏方法的访问修饰符[关闭]

Posted

技术标签:

【中文标题】为啥Java限制隐藏方法的访问修饰符[关闭]【英文标题】:Why does Java restrict the access modifier of a hiding method [closed]为什么Java限制隐藏方法的访问修饰符[关闭] 【发布时间】:2016-03-25 17:40:27 【问题描述】:

隐藏静态字段时,该字段在子类中的访问级别没有限制,甚至可以是非静态的,也可以是其他数据类型。

另一方面,当隐藏静态方法时,子类中的静态方法对父类隐藏静态方法可以允许比隐藏方法更多但不是更少的访问。

AFAIK,静态方法链接无论如何都是在编译时完成的,为什么会有这样的限制?

附:这个问题只是出于好奇。

【问题讨论】:

乔恩的怀疑(我没有将其标记为重复,因为答案只是基于 JLS 确认了它,而您的问题更多是关于为什么 JLS 是这样设计的):***.com/questions/26963828/…。关于字段:它们不是多态的(无论它们是否是静态的,因此没有必要限制它们的变化范围)。 恢复到预编辑状态。只是不希望人们将问题理解为“为什么允许使用字段而不允许使用方法”。 我更喜欢编辑,因为我认为这个问题是关于access modifier restrictions when hiding a method,在这种情况下,静态字段示例具有误导性。我会将问题表述为“为什么 Java 会限制隐藏方法的访问修饰符(因为隐藏不是多态的)? Jon Skeet 在comment 中假设,“它试图避免您显式调用Subclass.foo() 的情况,这是一个通常的私有方法解析为Superclass.foo()。”但我看不出这种情况会出现什么问题。 有趣的是,当 Java 8 向接口添加静态方法时,这个问题被避免了,因为那些静态方法是un-inheritable。 【参考方案1】:

因为在子类中,您覆盖了非私有超类方法,但覆盖了影子字段。至于设置更广泛的访问级别 - 你总是可以写类似

public void sublcassMethod() 
    supersecretSuperclassMethod();

因此,在语言级别使用更广泛的访问权限来限制覆盖是没有意义的 - 这种限制很容易提交

【讨论】:

问题是关于静态方法的。 是的,我知道。但是这种情况下的eclipse会告诉我们“-不能降低从超类继承的方法的可见性”。所以我认为,无论是静态方法还是非静态方法,继承机制都是一样的。 别忘了你可以在对象上调用静态方法。所以我想省略哪个静态方法调用的误解,在Java中静态和非静态方法具有相同的继承机制。 "在 Java 中静态和非静态方法具有相同的继承机制" - 不!请参阅here、here、here 和 here。互联网上有更多的例子。静态方法不要覆盖。只需尝试将@Override 放在您的子类方法中。

以上是关于为啥Java限制隐藏方法的访问修饰符[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA访问限制修饰符

java 访问修饰符

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

Java_修饰符详解

java访问修饰符

java命令行参数的默认访问修饰符是啥[关闭]