为啥类或接口不能接收私有或受保护的访问修饰符?

Posted

技术标签:

【中文标题】为啥类或接口不能接收私有或受保护的访问修饰符?【英文标题】: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 接口,但不适用于接口本身。 【参考方案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 可见。

以上是关于为啥类或接口不能接收私有或受保护的访问修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

抽象类中的抽象方法应该有啥访问修饰符?

为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符

类接口修饰符

C# 五大修饰符

PHP publicprivateprotected 修饰符

PHP publicprivateprotected 修饰符