面向对象的核心之一就是封装,只有把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是使外部调用方法对方法体内的实现细节知道的尽可能少。如何实现封装呢?需要使用某些关键字来限制类外部对类内属性和方法的随意访问,这些关键字就是访问权限控制符。
Java 中访问权限包括四个地那估计,权限控制严格程度由低到高,如下表
访问权限控制符 | 任何地方 | 包外子类 | 包内 | 类内 |
public | OK | OK | OK | OK |
protected | NO | OK | OK | OK |
默认 | NO | NO | OK | OK |
private | NO | NO | NO | OK |
- public : 可以修饰外部类、属性、方法,表示公开的、无限制的,是访问限制最松的,被其修饰的类、属性和方法不仅可以被包内访问,还可以跨类、跨包访问,甚至允许跨工程访问。
- protected : 只能修改属性和方法,表示受保护的、有限制的,被其修饰的属性 和方法能被包内及包外子类访问。即使并非继承关系, protected 属性和方法在同一包内也是可见的。
- 无:即无任何访问权限修饰符,无访问权限控制符仅对包内可见。
- private : 只能修饰属性、方法、内部类。表示私有的,是访问权限最严格的,被其修饰的属性和方法只能在该类内部访问,子类和包内君不能访问,更不允许跨包访问。
使用规则
- 如果不允许外部直接通过new创建对象,构造方法必须是private
- 工具类不允许有public 或 default构造方法
- 类非static成员变量并且 与子类共享,必须是protected
- 类非static 成员变量并且仅在本类使用,必须private
- 类static成员变量如果仅在本类 使用,必须是private
- 若是static成员变量,必须考虑是否为 final类 成员方法只供类内部使用,必须为private
- 类成员方方法只对继承类公开,那么限制为protected