代码之家  ›  专栏  ›  技术社区  ›  Coder-Man

包私有类中的公共修饰符是多余的吗?

  •  3
  • Coder-Man  · 技术社区  · 7 年前

    假设我在包中的test.java中声明了一个类测试 com.test 以下内容:

    class Test {
        public void test() {
    
        }
    }
    

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

    我认为这不是多余的,只要 Test 包含 public static void main(String[] args) {} 我是对还是错?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Ph1llip2    7 年前

    这不是多余的。如果你有一些派生类,那么修饰符会有很大的不同。考虑课程:

    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
        }
    
    }
    
        2
  •  1
  •   Timothy Truckle Vincent Boutot    7 年前

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

    因此,必须能够声明 公众的 方法中的 非公开 上课。

        3
  •  0
  •   Daniel Pryden    7 年前

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

    实际上这是很少见的。举个例子,如果你有另一个类 Test2 (在同一个包中)从 测试 它本身就是一个公共阶层,然后 公众的 修饰符或缺少修饰符将影响包外的代码是否可以调用 test() 关于类型的对象 测试2 是的。

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