Java 静态方法的受保护修饰符的用途是什么
在为我的另一个问题寻找解决方案时,我发现了Java 静态方法的受保护修饰符的用途是什么,java,oop,static-methods,protected,Java,Oop,Static Methods,Protected,在为我的另一个问题寻找解决方案时,我发现了protected修饰符的这种用法: 在org.unitils.reflectionassert.ReflectionComparatorFactory类中,有一个带有签名的方法: 受保护的静态列表getComparatorChain(设置模式) 但这只是一个特殊情况 毕竟,我们总是可以扩展这样的非最终类,并使用新的public修饰符“覆盖”它的静态protected方法。比如说,我们有一个类a: public class A { protect
protected
修饰符的这种用法:
在org.unitils.reflectionassert.ReflectionComparatorFactory
类中,有一个带有签名的方法:
受保护的静态列表getComparatorChain(设置模式)
但这只是一个特殊情况
毕竟,我们总是可以扩展这样的非最终类,并使用新的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();
}
}
我的问题集中在一个一般情况下,当一些
静态
方法被声明为受保护
时。我不是在问非静态字段或方法,因为在某些情况下,类可以有一个私有构造函数或一个非常复杂的构造函数,其中包含许多特殊参数。但是,如果整个类不是final,那么这种“隐藏”静态方法的目的是什么呢?这种使用是OOP错误还是仅仅是一种非常弱的“保护”?重写静态方法引用意味着隐藏它的实现。请参阅:Java文档的
静态方法
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法将隐藏超类中的方法
隐藏静态方法和重写实例方法之间的区别具有重要意义:
- 被调用的重写实例方法的版本是子类中的版本
- 调用的隐藏静态方法的版本取决于它是从超类还是子类调用的
protectedstatic
方法允许您为派生类提供“实用程序”类型的功能,而无需在公共API中公开它们,因为它们本身可能没有意义
我不知道您引用的
getComparatorChain
方法的实现,但我认为它就是这样一种方法。如果它没有绑定到任何特定实例,它将被标记为static
,并被标记为protected
,这样就不会成为公共API的一部分,而且还允许派生类在其自己的实现中重复使用实用程序方法。您不能重写静态方法。您只能在子类中重新定义它们。@当然,这就是为什么我将这个词“override”引到引号中,以强调我对这个术语的寓言用法这真的是重复的吗?另一个问题涉及到受保护的静态变量,这个问题涉及到受保护的静态方法。@bot我相信编程语言中的任何构造都必须具有可理解的用法。如果是受保护的静态方法,我就不能理解这样的想法。