为什么Java限制隐藏方法的访问修饰符

为什么Java限制隐藏方法的访问修饰符,java,static,method-hiding,Java,Static,Method Hiding,隐藏静态字段时,子类中字段的访问级别没有任何限制,甚至可以是非静态的和其他数据类型 另一方面,当隐藏静态方法时,从子类中隐藏静态方法(从超类中隐藏静态方法)的静态方法可以允许比隐藏方法更多但不更少的访问 好吧,静态方法链接无论如何都是在编译时完成的,那么为什么会有这样的限制呢 另外,这个问题只是出于好奇。因为在子类中,您覆盖了非私有超类方法,但覆盖了阴影字段。至于设置更广泛的访问级别,您始终可以编写如下内容 public void sublcassMethod() { supersecr

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

另一方面,当隐藏静态方法时,从子类中隐藏静态方法(从超类中隐藏静态方法)的静态方法可以允许比隐藏方法更多但不更少的访问

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


另外,这个问题只是出于好奇。

因为在子类中,您覆盖了非私有超类方法,但覆盖了阴影字段。至于设置更广泛的访问级别,您始终可以编写如下内容

public void sublcassMethod() {
    supersecretSuperclassMethod();
}

因此,在语言级别限制更广泛的访问权限是没有意义的-这种限制可以很容易地实现

Jon的怀疑(我没有将它标记为重复,因为答案只是基于JLS确认它,而您的问题更多的是关于为什么JLS是这样设计的):。关于字段:它们不是多态的(无论它们是静态的还是非静态的,所以在限制它们的更改范围方面并没有意义)。已恢复到预编辑状态。只是不想让人们把这个问题理解为“为什么允许使用for字段而不允许使用for方法”。我更喜欢编辑,因为我认为这个问题是关于的,在这种情况下,静态字段示例是误导性的。我想把这个问题表述为,“为什么Java限制隐藏方法的访问修饰符(因为隐藏不是多态的)?”Jon Skeet在a中假设,“它试图避免出现这样一种情况,即您显式调用
Subclass.foo()
,这是一种私有方法,通常解析为
超类.foo()
“但我看不出这个场景会出现什么问题。有趣的是,当Java 8向接口添加静态方法时,这个问题被避免了,因为这些静态方法都是。问题是关于静态方法的。是的,我知道。但是eclipse在这种情况下会告诉我们“不能降低从超类继承的方法的可见性”。所以我认为,无论静态方法还是非静态方法,继承机制都是相同的。不要忘记,您可以对对象调用静态方法。所以我想省去对静态方法调用的误解,在Java中,静态方法和非静态方法具有相同的继承机制!看,还有。互联网上还有更多的例子。静态方法不重写。只需尝试在子类方法上添加
@Override