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

abh*_*ips 21 java access-specifier

我试图学习java,当我通过访问说明符时,我有一个疑问,如果没有指定默认值和受保护的访问说明符,有什么区别?

Cod*_*ter 39

这个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
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 34

protected说明符允许通过有关类别,不管包他们居住在,以及在同一个包中的其他代码的子类访问.默认说明符允许同一包中的其他代码访问,但不允许通过驻留在不同包中的子类中的代码访问.请参阅Java语言规范第6.6节.

编辑:根据MichaelSchmeißer的要求(所以其他人不必阅读评论或按照链接查找):接口的所有成员都是隐式公开的.实际上,为除了以外的接口成员指定任何访问说明符是一个编译时错误public(尽管没有访问说明符默认为公共访问).以下是来自JLS的类成员规则的完整规则(请参阅上面的包,规则,顶级类和接口以及数组的链接):

只有在类型可访问且声明成员或构造函数允许访问时,才能访问引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数:

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

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

  • 否则,如果成员或构造函数被声明为protected,则只有在满足以下条件之一时才允许访问:

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

  • 如第6.6.2节所述,访问是正确的.(此子句指的是允许派生类访问超类的受保护成员的规则;第6.6.2节开始:"对象的受保护成员或构造函数可以从包外部访问,只能通过代码来声明它.负责该对象的实施."然后详细说明."

  • 否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.

  • 否则,我们说存在默认访问权限,只有在声明类型的包中发生访问时才允许访问.

  • @ david.dionis - 这是不正确的.无法从另一个包中声明的子类访问具有默认访问权限的字段,方法或其他成员. (4认同)

Gio*_*uri 5

长话短说:

default成员在同一包的所有其他类中都可用;

protected成员在同一包的所有其他类 以及 任何其他包的任何其他类中都可用,只要该类扩展了包含受保护成员的类。