这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
类成员的访问控制
访问控制修饰符决定了其他类是否能使用一个特定的字段或者调用一个特定的方法。有两种级别的访问控制:
- 类级别 public或者package-private(非显示修饰符)
- 成员级别 public、protected、private和package-private(非显示修饰符)
类可以声明为public的,这表示所有的类都可以访问该类。如果类没有修饰符,那么类只能被同一个包下面的其他类访问。
在成员级别,你也可以用public或者无修饰符来修饰成员,它们的含义与类级别的相同。对成员来说,有另外两种访问修饰符:private和protected。private修饰的成员表示只能在类内部访问,protected修饰的成员表示除了能在类内部访问外,还可以在类的子类中访问。
如下表格显示了不同修饰符下成员的访问级别:
修饰符 | Class | Package | SubClass | World |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
package-private | Y | Y | N | N |
private | Y | N | N | N |
第一列(Class)是指类自身是否能访问对应修饰符修饰的成员。第二列(Package)是指同一个包下面的类是否能访问对应修饰符修饰的成员。第三列(SubClass)是指类的子类(与当前类不同包)是否能访问对应修饰符修饰的成员。第四列(World)是指所有的类是否能访问对应修饰符修饰的成员。
访问级别对你有两种影响:第一是当你想使用来自于其他源文件中的类时,比如Java平台,访问级别将决定有哪些类你可以直接使用,第二是当你在编写代码时,你需要考虑你编写类的成员变量和方法需要指定什么访问级别。
让我们看一组类,看看访问级别是如何影响可见性。下面的图显示了4个类以及它们的关系:
下表显示了Alpha类的成员对于可以应用于它们的每个访问修饰符在哪些类中是可见的。
修饰符 | 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字段。公共字段倾向于将你链接到特定的实现,并限制更改代码的灵活性。