【问题标题】:Why can't a class or an interface receive private or protected access modifiers?为什么类或接口不能接收私有或受保护的访问修饰符?
【发布时间】:2011-10-07 18:28:58
【问题描述】:

我正在阅读一些 Java 文本,文本说我们只能为类和接口应用 publicdefault 访问修饰符。因此,如果我们声明如下是编译错误:

private class A {}

protected class A{}

我只是好奇为什么类或接口不能接收privateprotected 访问修饰符?

【问题讨论】:

  • 只要 A 和 B 不是顶级类,我们声明私有类 A { } 或受保护类 B { } 都不是编译错误。
  • 我相信接口的默认访问是公开的,所以实际上接口总是公开的。
  • @Adriaan Koster 否。该规则适用于 inside 接口,但不适用于接口本身。

标签: java access-modifiers


【解决方案1】:

private 表示“仅在封闭类中可见”。

protected 表示“仅在封闭类和任何子类中可见,并且在封闭类的包中的任何位置都可见”。

private 因此,应用于顶级类时没有任何意义; protected 定义的第一部分也是如此。 protected 的第二部分可以适用,但它被默认(包保护)修饰符覆盖,因此protected 部分无意义,部分多余。

privateprotected 都可以(并且经常)应用于嵌套类和接口,但不能应用于顶级类和接口。

【讨论】:

    【解决方案2】:

    顶级类只能拥有publicdefault 访问权限,但内部类可以拥有private access

    public class TestClassAccess
    {
        public static void main(String[] args)
        {
            new TestClassAccess().new TestClassPrivateAccess();
        }
    
        private class TestClassPrivateAccess
        {
            TestClassPrivateAccess()
            {
                System.out.println("I'm a private class");
            }
        }
    }
    

    【讨论】:

    • 很好的例子。内部类也可以是静态的。内部接口和枚举是隐式静态的。
    【解决方案3】:

    在顶层只有两个类可见性的用例 (a) 随处可见 (b) 仅在包内可见。因此只有两个修饰符(public 和默认值)。如果类是public,那么它对所有类都是可见的。如果没有访问修饰符,则仅对同一包中的类可见。

    如果在顶层有更多的类可见性用例,Java 语言会提供更多的修饰符。

    【讨论】:

    • 首先,可见性的情况比 Java 提供的更多(参见例如 c#),其次,您可以拥有带有受保护或私有修饰符的类 - 只是没有顶级修饰符。
    • @Voo,顶层只有两个用例。我相信问题暗示正如它所说的任何其他修饰符都会产生编译错误
    • 类的可见性意味着什么?
    • 如果类 A 可以访问(创建、调用成员函数等)类 B,则称类 B 对类 A 可见。
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2013-03-05
    • 2012-06-22
    相关资源
    最近更新 更多