Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别的访问控制:
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
字段。(本教程中的许多示例使用公共字段。这可能有助于简洁地说明一些观点,但不建议用于生产代码。)公共字段倾向于将你链接到特定的实现,并限制你更改代码的灵活性。