Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法的受保护修饰符的用途是什么_Java_Oop_Static Methods_Protected - Fatal编程技术网

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文档的

静态方法

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

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

  • 被调用的重写实例方法的版本是子类中的版本
  • 调用的隐藏静态方法的版本取决于它是从超类还是子类调用的
但是,如果整个类不是final,那么这种“隐藏”静态方法的目的是什么呢

protectedstatic
方法允许您为派生类提供“实用程序”类型的功能,而无需在公共API中公开它们,因为它们本身可能没有意义


我不知道您引用的
getComparatorChain
方法的实现,但我认为它就是这样一种方法。如果它没有绑定到任何特定实例,它将被标记为
static
,并被标记为
protected
,这样就不会成为公共API的一部分,而且还允许派生类在其自己的实现中重复使用实用程序方法。

您不能重写静态方法。您只能在子类中重新定义它们。@当然,这就是为什么我将这个词“override”引到引号中,以强调我对这个术语的寓言用法这真的是重复的吗?另一个问题涉及到受保护的静态变量,这个问题涉及到受保护的静态方法。@bot我相信编程语言中的任何构造都必须具有可理解的用法。如果是
受保护的静态
方法,我就不能理解这样的想法。