假设我在包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
,同样允许方法本身在包之外可见,其中类本身可能不可见,但接口可能是可见的。