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”在这里是多余的,但我认为它应该对此发出警告。