为啥类或接口不能接收私有或受保护的访问修饰符?
Posted
技术标签:
【中文标题】为啥类或接口不能接收私有或受保护的访问修饰符?【英文标题】:Why can't a class or an interface receive private or protected access modifiers?为什么类或接口不能接收私有或受保护的访问修饰符? 【发布时间】:2011-10-07 18:28:58 【问题描述】:我正在阅读一些 Java 文本,文本说我们只能为类和接口应用 public
或 default
访问修饰符。因此,如果我们声明如下是编译错误:
private class A
或
protected class A
我只是好奇为什么类或接口不能接收private
或protected
访问修饰符?
【问题讨论】:
只要 A 和 B 不是***类,我们声明私有类 A 或受保护类 B 都不是编译错误。 我相信接口的默认访问是公开的,所以实际上接口总是公开的。 @Adriaan Koster 否。该规则适用于 inside 接口,但不适用于接口本身。 【参考方案1】:private
表示“仅在封闭类中可见”。
protected
表示“仅在封闭类和任何子类中可见,并且在封闭类的包中的任何位置都可见”。
private
因此,应用于***类时没有任何意义; protected
定义的第一部分也是如此。 protected
的第二部分可以适用,但它被默认(包保护)修饰符覆盖,因此protected
部分无意义,部分多余。
private
和 protected
都可以(并且经常)应用于嵌套类和接口,但不能应用于***类和接口。
【讨论】:
【参考方案2】:***类只能拥有public
或default
访问权限,但内部类可以拥有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 类(对象)中使用受保护的访问修饰符