我在搜索问题的解决方案时发现了protected
修饰符的使用:Ignoring case in strings with unitils ReflectionComparator
在org.unitils.reflectionassert.ReflectionComparatorFactory
课程中,有签名的方法:
protected static List<Comparator> getComparatorChain(Set<ReflectionComparatorMode> modes)
但这只是特殊情况。
毕竟我们总是可以扩展这样的任何非final类,并使用新的protected
修饰符“覆盖”它的静态public
方法。说,我们有课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
,那么这种“隐藏”静态方法的目的是什么?这种用法是错误还是只是非常弱的“保护”?
答案 0 :(得分:2)
覆盖静态方法引用意味着隐藏它的实现。请参阅:Java文档&#39; Overriding and Hiding Methods
静态方法
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。
隐藏静态方法和覆盖实例方法之间的区别具有重要意义:
- 被调用的重写实例方法的版本是子类中的版本。
- 被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。
答案 1 :(得分:2)
但如果整个班级不是最终的,那么这种“隐藏”静态方法的目的是什么呢?
protected static
方法允许您为派生类提供“实用程序”类型功能,而不会在公共API中公开它们可能没有意义。
我不知道您引用的getComparatorChain
方法的实现,但我想这是一种方法。如果它没有绑定到任何特定实例,则标记为static
,并标记为protected
以便不是公共API的一部分,而且还允许派生类重用实用程序方法在它自己的实现中。