Java 中默认访问说明符和受保护访问说明符之间的区别

2022-09-01 11:09:59

我试图学习java,当我通过访问说明符时,我有一个疑问。如果未指定任何内容,则默认访问说明符与 java 中的受保护访问说明符之间有什么区别?


答案 1

这个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

答案 2

说明符允许相关类的所有子类(它们所在的任何包)以及同一包中的其他代码进行访问。默认说明符允许同一包中的其他代码访问,但不允许驻留在不同包中的子类中的代码访问。请参阅 Java 语言规范第 6.6 节protected

编辑:根据Michael Schmeißer的请求(因此其他人不必通读评论或点击链接即可找到此内容):接口的所有成员都是隐式公开的。实际上,为接口成员指定除以下条件之外的任何访问说明符都是编译时错误(尽管根本没有访问说明符默认为公共访问)。以下是 JLS 中针对类成员的完整规则集(有关包、顶级类和接口以及数组的规则,请参阅上面的链接):public

仅当引用(类、接口或数组)类型的成员(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数可访问时,才可访问该类型,并且将该成员或构造函数声明为允许访问:

  • 如果成员或构造函数被声明为公共,则允许访问。

  • 接口的所有成员都是隐式公共的。

  • 否则,如果成员或构造函数被声明为受保护,则仅当满足以下条件之一时才允许访问:

  • 从包含声明受保护成员或构造函数的类的包中访问成员或构造函数。

  • 访问是正确的,如 §6.6.2 中所述。(此子句是指允许派生类访问超类的受保护成员的规则;§6.6.2 的开头是:“对象的受保护成员或构造函数可以从包外部访问,在该包中,该包中仅由负责实现该对象的代码声明。然后它详细说明了这一点。

  • 否则,如果成员或构造函数被声明为私有,则当且仅当访问发生在包含成员或构造函数声明的顶级类 (§7.6) 的主体中时,才允许访问。

  • 否则,我们说存在默认访问,仅当从声明类型的包中进行访问时,才允许默认访问。


推荐