受保护的静态方法访问

5
我正在尝试使用Lucene信息检索API中的受保护静态方法。我理解静态方法是从类定义中访问的,我对受保护关键字的理解是只能从该类或子类的实例中访问。那么如何访问受保护的静态方法呢?我的理解是否有误?我正在尝试从导入的jar库中调用受保护的静态方法。我该怎么做?
在这种情况下,我正在从StopwordAnalyzerBase中调用loadStopwordSet方法。

嗯,我不明白为什么一个方法既应该是protected又应该是static。静态方法应该是“独立的”。无论如何,如果你想要访问这个方法,你正在尝试调用它的类应该继承包含静态方法的超类。 - nafas
@nafas 我也是这么想的,但我必须使用Lucene,而且它就是这样编写的。 - ford prefect
嘿,我更新了我的评论。希望有帮助。 - nafas
http://programmers.stackexchange.com/questions/229220/what-is-difference-between-protected-static-method-and-protected-method - nafas
@nafas 我正在从定义它的类中调用它 StopwordsAnalyzerBase。 - ford prefect
看看那个链接,解释得很清楚。(虽然我还不是它的粉丝) - nafas
2个回答

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)以及其他许多地方调用。

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

2

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


我尝试从扩展了基类的EnglishAnalyzer中调用它,但是Eclipse说它仍然不可见。 - ford prefect

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接