Java 中默认访问说明符和受保护访问说明符之间的区别
我试图学习java,当我通过访问说明符时,我有一个疑问。如果未指定任何内容,则默认访问说明符与 java 中的受保护访问说明符之间有什么区别?
我试图学习java,当我通过访问说明符时,我有一个疑问。如果未指定任何内容,则默认访问说明符与 java 中的受保护访问说明符之间有什么区别?
这个Java教程可能对你有一些用处。
Modifier | Class | Package | Subclass | World
public | Y | Y | Y | Y
protected | Y | Y | Y | N
no modifier | Y | Y | N | N
private | Y | N | N | N
说明符允许相关类的所有子类(它们所在的任何包)以及同一包中的其他代码进行访问。默认说明符允许同一包中的其他代码访问,但不允许驻留在不同包中的子类中的代码访问。请参阅 Java 语言规范第 6.6 节。protected
编辑:根据Michael Schmeißer的请求(因此其他人不必通读评论或点击链接即可找到此内容):接口的所有成员都是隐式公开的。实际上,为接口成员指定除以下条件之外的任何访问说明符都是编译时错误(尽管根本没有访问说明符默认为公共访问)。以下是 JLS 中针对类成员的完整规则集(有关包、顶级类和接口以及数组的规则,请参阅上面的链接):public
仅当引用(类、接口或数组)类型的成员(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数可访问时,才可访问该类型,并且将该成员或构造函数声明为允许访问:
如果成员或构造函数被声明为公共,则允许访问。
接口的所有成员都是隐式公共的。
否则,如果成员或构造函数被声明为受保护,则仅当满足以下条件之一时才允许访问:
从包含声明受保护成员或构造函数的类的包中访问成员或构造函数。
访问是正确的,如 §6.6.2 中所述。(此子句是指允许派生类访问超类的受保护成员的规则;§6.6.2 的开头是:“对象的受保护成员或构造函数可以从包外部访问,在该包中,该包中仅由负责实现该对象的代码声明。然后它详细说明了这一点。
否则,如果成员或构造函数被声明为私有,则当且仅当访问发生在包含成员或构造函数声明的顶级类 (§7.6) 的主体中时,才允许访问。
否则,我们说存在默认访问,仅当从声明类型的包中进行访问时,才允许默认访问。