受保护的静态方法访问

Posted

技术标签:

【中文标题】受保护的静态方法访问【英文标题】:Protected Static Method Access 【发布时间】:2014-12-19 07:11:55 【问题描述】:

我正在尝试在 Lucene 信息检索 api 中使用受保护的静态方法。我对 static 的理解是它们是从类定义中访问的,而我对 protected 关键字的理解是它们只能从该类或子类的实例中访问。那么究竟如何访问静态保护方法呢?我的理解有误吗?我正在尝试从导入的 jar 中的库中调用受保护的静态方法。我该怎么做?

在这种情况下,我从 StopwordAnalyzerBase 调用 loadStopwordSet

【问题讨论】:

嗯,我不明白为什么一个方法应该同时受到保护和静态。静态方法应该是“独立的”。无论如何,如果您尝试访问此方法,您尝试从中调用它的类应该扩展静态方法所在的超类。 @nafas 这也是我的想法,但我必须使用 Lucene,这就是它的编写方式 嘿,我更新了我的评论。希望对您有所帮助 programmers.stackexchange.com/questions/229220/… @nafas 我从定义它的类中调用它 StopwordsAnalyzerBase 【参考方案1】:

类名的“Base”部分应该给你一个提示:这是从 StopwordAnalyzerBase 的子类调用的 它是静态的,因为它不需要是实例方法(它是自包含的,不会改变调用它的对象的状态)。不过,查看 API 并不能告诉我为什么它会受到保护 - 除了遵循最低权限原则之外,我想

【讨论】:

我尝试从扩展基础的EnglishAnalyzer调用它,而eclipse说它仍然不可见【参考方案2】:

为什么不能通过将其称为StopwordAnalyzerBase.loadStopwordSet(params) 来调用此方法?

考虑这个例子(在我的机器上编译和工作):

package p1;

public class C1 
    protected void nonStatic() 
    protected static void isStatic() 


----
package p2;

import p1.C1;

public class C2 extends C1 
   public void someMethod() 
     super.nonStatic();
     C1.isStatic();     // or even C2.isStatic()
   

回到你原来的问题,我可以看到这个方法是从 ArabicAnalyzer:78(Lucene 版本 4.9.0,包 org.apache.lucene.analysis.ar)以及许多其他方法中调用的。

【讨论】:

花了一分钟才明白,但我明白了。我需要在扩展类中调用静态方法

以上是关于受保护的静态方法访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个类的静态方法中访问类的受保护变量?

受保护的静态成员变量

静态方法的受保护修饰符的目的是啥

派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?

为啥我不能访问静态多态派生类中的受保护成员?

静态成员函数无法访问类的受保护成员