降低静态方法的可见性
我知道一个孩子不能降低非静态方法的可见性,我理解为什么会这样。
然而,我已经阅读过“静态方法可以通过重新声明隐藏”。 但是我不明白如何在Java中实现这一点。
这真的有可能吗? 如果是的话,该怎么做(代码示例)以及它为什么被引入(它似乎与非减少接口可见性的原则相矛盾)?
基于hagubear的宝贵评论,似乎声明的作者意味着通过使用具有相同声明的方法重载它来隐藏方法。
引用此链接 :
我们可以在子类中声明具有相同签名的静态方法,但不会考虑覆盖,因为不会有任何运行时多态。 (…)如果派生类定义了与基类中的静态方法具有相同签名的静态方法,则派生类中的方法会隐藏基类中的方法。
因此,在具有完全相同声明的子类中定义方法有效地隐藏了子中的原始方法。 但是,如果是字段,则转换为父级将恢复原始访问权限。
示例代码:
public class Test { public static void main( String[] args ) { B b = new B(); A a = b; bf(); // "Access somewhat denied" af(); // "f()" } } class A { public static void f() { System.out.println("f()"); } } class B extends A { // *must* be public public static void f() { System.out.println("Access somewhat denied"); } }
所以我创造了一个微不足道的测试; IntelliJ确实拒绝了它……是的,我知道“这是一个工具……但我相信它”。 无论如何,我去了javac,它发出了相同的错误:
Error:(...) java: ...Concrete.java:5: doSomethingStatic() in ...Concrete cannot override doSomethingStatic() in ...Base; attempting to assign weaker access privileges; was public
基于此,以及我们一般的怀疑,我建议错误在您的文档中。
下面是我的示例代码,我认为相当明确。 它在protected
barfs。
public class Base { public static void doSomethingStatic(){} } public class Concrete extends Base { protected static void doSomethingStatic(){} }
它可以通过派生类中的重载重新声明来隐藏:
class Base { public static void doSomethingStatic(){} } class Derived extends Base { public static void doSomethingStatic(String arg){} }
但只对那些试图通过派生类访问它的人隐藏。