繁体   English   中英

静态方法的受保护修饰符的目的是什么

[英]What is the purpose of protected modifier for static methods

我在为我的另一个问题寻找解决方案时发现了这种protected修饰符的用法: Ignoring case in strings with unitils ReflectionComparator

org.unitils.reflectionassert.ReflectionComparatorFactory类中有一个带有签名的方法:

protected static List<Comparator> getComparatorChain(Set<ReflectionComparatorMode> modes)

但这只是一个特例。

毕竟我们总是可以扩展这样的任何非 final 类并使用新的public修饰符“覆盖”它的静态protected方法。 说,我们有一个A类:

public class A {
    protected static void test() {
        // do some stuff
    }
}

并想在另一个包中使用它:

public class UseA {
    private static class MyA extends A {
        public static void test() {
            A.test();
        }
    }

    void useA() {
        // A.test(); compile error, sure
        MyA.test();
    }
}

当某些static方法被声明为protected时,我将我的问题集中在一般情况上。 我不是在问非静态字段或方法,因为在某些情况下,类可以有一个私有构造函数或一个非常复杂的构造函数,其中包含许多特殊参数。 但是,如果整个类不是final那么这种“隐藏”静态方法的目的是什么? 这种用法是 OOP 错误还是只是非常薄弱的​​“保护”?

但是如果整个类不是最终的,那么这种“隐藏”静态方法的目的是什么?

protected static方法将允许您为派生类提供“实用程序”类型的功能,而不会将它们暴露在公共 API 中,因为它们本身可能没有意义。

我不知道你引用的getComparatorChain方法的实现,但我想它是这样一个方法。 如果它不绑定到任何特定实例,它将被标记为static ,并被标记为protected以便不成为公共 API 的一部分,但也允许派生类在其自己的实现中重用实用程序方法。

覆盖静态方法引用意味着隐藏它的实现。 请参阅:Java 文档的覆盖和隐藏方法

静态方法

如果子类定义了与超类中的静态方法具有相同签名的静态方法,则子类中的方法隐藏超类中的方法。

隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

  • 被调用的重写实例方法的版本是子类中的版本。
  • 被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM