Java 包私有类中的公共修饰符是否冗余?
假设我在包Java 包私有类中的公共修饰符是否冗余?,java,Java,假设我在包com.Test中的Test.java中声明了一个类测试: class Test { public void test() { } } 我想知道,方法test()的公共访问修饰符在这里不是多余的吗?因为intellij没有给我暗示说是的 我认为只有当类Test包含publicstaticvoidmain(String[]args){}我是对的还是错的时候它才是多余的?任何类都可以实现接口。后者包含的方法声明总是公共的。此外,不能降低接口方法的可见性 因此,必须能够在
com.Test
中的Test.java中声明了一个类测试:
class Test {
public void test() {
}
}
我想知道,方法test()
的公共访问修饰符在这里不是多余的吗?因为intellij没有给我暗示说是的
我认为只有当类
Test
包含publicstaticvoidmain(String[]args){}
我是对的还是错的时候它才是多余的?任何类都可以实现接口。后者包含的方法声明总是公共的
。此外,不能降低接口方法的可见性
因此,必须能够在非公共类中声明
public
方法。这不是多余的,因为如果包外确实有Test
类型的对象,那么public
修饰符可以使方法可见,即使类本身不可见
实际上,这是相当罕见的。例如,如果您有另一个类Test2
(在同一个包中),它从Test
扩展而来,并且本身是一个公共类,那么public
修饰符或缺少它将影响包外的代码是否可以在Test2
类型的对象上调用Test()
另一种更常见的情况是
Test
实现了一个接口;然后,方法必须是公共的,同样地,允许方法本身在包外可见,其中类本身可能不可见,但接口可能可见。它不是多余的。如果您有一些派生类,那么修饰符会产生巨大的差异。考虑类:
package ex.one
class Test {
public void testPublic() {
}
void testPackage() {
}
}
和另一个派生Test.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
}
}
好吧,如果这门课是期末考试呢?这是个很好的问题。当类是final且包可见时,则不存在子类。在这种情况下,public方法
testPublic()
将具有与包可见性方法testPackage()
相同的可见性约束。但我建议使用public修饰符,因为它使类更易于阅读,并表明应该调用public方法。Intellij并没有说“public”在这里是多余的,但我认为它应该对此发出警告。