【问题标题】:Is the public modifier redundant inside a package private class?包私有类中的公共修饰符是否多余?
【发布时间】:2018-07-09 16:19:25
【问题描述】:

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

class Test {
    public void test() {

    }
}

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

    这不是多余的。如果你有一些派生类,那么修饰符会产生巨大的影响。考虑类:

    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 的类时,您可以在方法上看到不同的行为。在这种情况下,这个类有一个 public 修饰符。

    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
        }
    
    }
    

    【讨论】:

    • 好的,如果课程是最终的呢?
    • 这是一个非常好的问题。当类是最终类且包可见时,则不存在子类。在这种情况下,公共方法testPublic() 将具有与包可见性方法testPackage() 相同的可见性约束。但我建议使用 public 修饰符,因为它使类更易于阅读和显示,应该调用公共方法。
    • Intellij 并没有说“public”在这里是多余的,但我认为它应该警告这一点。
    【解决方案2】:

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

    因此必须可以在非公共类中声明public方法。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 2016-06-03
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2016-06-25
        • 1970-01-01
        • 2021-12-26
        相关资源
        最近更新 更多