访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。访问控制分为两个级别:
- 在最高级别——
public
,或package-private(无显式修饰符)。 - 在成员级别——
public
,private
,protected
,或package-private(没有明确的修饰符)。
可以使用public
修饰符声明一个类,在这种情况下,该类对于所有地方的类都是可见的。如果一个类没有修饰符(默认值,也称为package-private),则它仅在其自己的包中可见(包被命名为相关类的组,您将在以后的课程中了解。)
在成员级别,也可以像顶级类一样使用public
修饰符或不使用修饰符(package-private),并且含义相同。对于成员,还有两个附加的访问修饰符:private
和protected
。private
修饰符指定了成员只能在自己的类访问。protected
修饰符指定成员只能在其自己的程序包中(与package-private一样)访问,以及只能由其在另一个程序包中的类的子类访问。
下表显示了每个修饰符对允许的成员的访问。
访问级别
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平台中的类)时,访问级别确定您的类可以使用这些类的哪些成员。其次,编写类时,需要确定类中每个成员变量和每个方法应具有的访问级别。
让我们看一下类的集合,看看访问级别如何影响可见性。 下图显示了示例中的四个类以及它们之间的关系。
用于说明访问级别的示例的类和包
下表显示了可以应用于Alpha类成员的每个访问修饰符的能见度。
能见度
Modifier | Alpha | Beta | Alphasub | Gamma |
---|---|---|---|---|
public |
Y | Y | Y | Y |
protected |
Y | Y | Y | N |
no modifier | Y | Y | N | N |
private |
Y | N | N | N |
选择访问级别的提示:
如果其他程序员使用您的类,则要确保不会发生由于滥用而引起的错误。访问级别可以帮助您做到这一点。
- 使用对特定成员有意义的最严格的访问级别。除非有充分的理由,否则请使用
private
。 - 避免使用常量以外的
public
字段。(本教程中的许多示例都使用public
字段。这可能有助于简要说明一些要点,但不建议在生产代码中使用。)公共字段倾向于将您链接到特定的实现,并限制了更改代码的灵活性。