包私有类中的公共修饰符是否冗余?

  • 本文关键字:是否 冗余 包私 java
  • 更新时间 :
  • 英文 :


假设我在包com.test中声明了一个类测试.java:

class Test {
public void test() {
}
}

我想知道,该方法的公共访问修饰符在这里不是多余的test()吗?因为 intellij 没有给我一个提示说它是。

我认为只有当类Test包含public static void main(String[] args) {}我是对还是错

它不是多余的。如果你有一些导数类,那么修饰符会产生巨大的差异。考虑这些类:

package ex.one
class Test {
public void testPublic() {
}
void testPackage() {
}    
}

以及另一个派生测试的类.class

package ex.one
public class TestDerivate extends Test {
private void doSomething(){
//legal
testPublic();
testPackage();
}
}

现在,当我们有另一个派生TestDerivate的类时.class那么您可以看到方法的不同行为。在本例中,此类具有公共修饰符。

package ex.two
public class TestDerivateInOtherPackage extends TestDerivate {
public void test(){
// legal
testPublic();
//illegal since it is only package visible
testPackage();
}
@Override
public void testPublic() {
// still legal
}
@Override
void testPackage() {
// still illegal
}
}

任何类都可以实现接口。后者包含始终public的方法声明。此外,您不能降低接口方法的可见性。

因此,必须能够在非公共类中声明public方法。

它不是多余的,因为如果您在包外部确实有一个类型Test的对象,则public修饰符可以使该方法可见,即使类本身不是。

在实践中,这种情况非常罕见。例如,如果您有另一个类Test2(在同一包中),它从Test扩展并且本身是一个公共类,则public修饰符或缺少修饰符将影响包外部的代码是否可以在类型Test2的对象上调用test()

另一种更常见的情况是,如果Test实现了一个接口;那么该方法必须public,同样允许方法本身在包之外可见,其中类本身可能不可见,但接口可能是可见的。

最新更新