【发布时间】:2016-03-25 17:40:27
【问题描述】:
隐藏静态字段时,该字段在子类中的访问级别没有限制,甚至可以是非静态的,也可以是其他数据类型。
另一方面,当隐藏静态方法时,子类中的静态方法对父类隐藏静态方法可以允许比隐藏方法更多但不是更少的访问。
AFAIK,静态方法链接无论如何都是在编译时完成的,为什么会有这样的限制?
附:这个问题只是出于好奇。
【问题讨论】:
-
乔恩的怀疑(我没有将其标记为重复,因为答案只是基于 JLS 确认了它,而您的问题更多是关于为什么 JLS 是这样设计的):stackoverflow.com/questions/26963828/…。关于字段:它们不是多态的(无论它们是否是静态的,因此没有必要限制它们的变化范围)。
-
恢复到预编辑状态。只是不希望人们将问题理解为“为什么允许使用字段而不允许使用方法”。
-
我更喜欢编辑,因为我认为这个问题是关于access modifier restrictions when hiding a method,在这种情况下,静态字段示例具有误导性。我会将问题表述为“为什么 Java 会限制隐藏方法的访问修饰符(因为隐藏不是多态的)?”
-
Jon Skeet 在comment 中假设,“它试图避免您显式调用
Subclass.foo()的情况,这是一个通常的私有方法解析为Superclass.foo()。”但我看不出这种情况会出现什么问题。 -
有趣的是,当 Java 8 向接口添加静态方法时,这个问题被避免了,因为那些静态方法是un-inheritable。
标签: java static method-hiding