【发布时间】:2015-06-28 15:28:20
【问题描述】:
在为我的另一个问题寻找解决方案时,我发现了 protected 修饰符的这种用法:Ignoring case in strings with unitils ReflectionComparator
org.unitils.reflectionassert.ReflectionComparatorFactory 类中有一个带有签名的方法:
protected static List<Comparator> getComparatorChain(Set<ReflectionComparatorMode> modes)
但这只是特例。
毕竟我们总是可以扩展这样的任何非最终类并使用新的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 错误还是只是一个非常弱的“保护”?
【问题讨论】:
-
您不能覆盖静态方法。只能在子类中重新定义。
-
@bot 当然,这就是为什么我将“覆盖”这个词放在引号中以强调我对这个词的寓言用法
-
这真的是复制品吗?另一个问题是指受保护的静态变量,这个问题是指受保护的静态方法。
-
@bot 我相信编程语言中的任何结构都必须具有可理解的使用感。在
protected static方法的情况下,我无法理解这样的想法。
标签: java oop static-methods protected