![](/img/trans.png)
[英]What is the purpose of having protected methods in java.lang.Object class?
[英]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.