# 控制对类成员的访问

> 原文： [https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)

访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。访问控制有两个级别：

*   在顶层 - `public`或 _ 包私有 _（无显式修饰符）。
*   在成员级别 - `public`，`private`，`protected`或 _ 包私有 _（无显式修饰符）。

可以使用修饰符`public`声明一个类，在这种情况下，该类对于所有类都可见。如果一个类没有修饰符（默认，也称为 _package-private_ ），它只在自己的包中可见（包是相关类的命名组 - 您将在后面的课程中了解它们） 。）

在成员级别，您也可以使用`public`修饰符或无修饰符（ _package-private_ ），就像使用顶级类一样，具有相同的含义。对于成员，还有两个额外的访问修饰符：`private`和`protected`。 `private`修饰符指定只能在其自己的类中访问该成员。 `protected`修饰符指定只能在自己的包中访问该成员（与 _package-private_ 一样），此外，还可以在另一个包中使用其类的子类。

下表显示了每个修饰符允许的成员访问权限。

Access Levels
| 修改 | 类 | 包 | 子类 | 世界 |
| --- | --- | --- | --- | --- |
| `public` | ÿ | ÿ | ÿ | ÿ |
| `protected` | ÿ | ÿ | ÿ | ñ |
| 没有修饰语 | ÿ | ÿ | ñ | ñ |
| `private` | ÿ | ñ | ñ | ñ |

第一个数据列指示类本身是否可以访问由访问级别定义的成员。如您所见，类始终可以访问自己的成员。第二列指示与该类相同的包中的类（无论其父级是否有）可以访问该成员。第三列指示在此包外声明的类的子类是否可以访问该成员。第四列指示是否所有类都可以访问该成员。

访问级别以两种方式影响您。首先，当您使用来自其他源的类（例如 Java 平台中的类）时，访问级别将确定您自己的类可以使用的这些类的哪些成员。其次，当您编写一个类时，您需要确定每个成员变量和类中的每个方法应具有的访问级别。

让我们看一下类的集合，看看访问级别如何影响可见性。 下图显示了此示例中的四个类以及它们之间的关系。

![Classes and Packages of the Example Used to Illustrate Access Levels](img/988f082815b7a887bbc725a96dc6ea07.jpg)

用于说明访问级别的示例的类和包



下表显示了可以应用于每个访问修饰符的 Alpha 类成员的位置。

Visibility
| 修改 | Α | Beta 版 | Alphasub | 伽玛 |
| --- | --- | --- | --- | --- |
| `public` | ÿ | ÿ | ÿ | ÿ |
| `protected` | ÿ | ÿ | ÿ | ñ |
| 没有修饰语 | ÿ | ÿ | ñ | ñ |
| `private` | ÿ | ñ | ñ | ñ |

* * *

**Tips on Choosing an Access Level:** 

如果其他程序员使用您的类，您希望确保不会发生滥用错误。访问级别可以帮助您执行此操作。

*   使用对特定成员有意义的最严格的访问级别。使用`private`除非你有充分的理由不这样做。
*   除常量外，避免使用`public`字段。 （本教程中的许多示例都使用公共字段。这可能有助于简明地说明某些要点，但不建议用于生产代码。）公共字段倾向于将您链接到特定实现，并限制您更改代码的灵活性。

* * *