Java封装的核心是用private隐藏字段并提供受控的public/protected/default方法访问;需避免返回可变对象引用、忽略参数校验及误设访问修饰符。

Java 封装的核心,就是把数据(字段)和操作数据的方法“包”在一起,并限制外部对字段的直接访问,只允许通过定义好的方法(如 getter/setter)来读写。而实现这一限制的关键,正是访问控制符。
用 private 隐藏字段,切断外部直连
这是封装最基础也最关键的一步。把类的成员变量声明为 private,就锁死了所有外部类(包括同包其他类、子类、不同包任意类)直接访问它的可能。
- 哪怕在同一个包里,其他类也不能写
obj.fieldName去读或改这个变量 - 子类也无法通过继承直接使用该变量——它存在,但不可见、不可访问
- 这样就从源头上防止了非法赋值、越界修改、状态不一致等问题
提供 public 或 protected 方法作为唯一入口
字段私有化后,必须配套提供受控的访问方式。通常做法是:
- 用 public 的 getter 方法(如
getName())对外提供只读或校验后的读取能力 - 用 public 的 setter 方法(如
setAge(int age))对外提供带逻辑检查的写入能力(比如拒绝负数年龄) - 如果该方法仅希望被子类或同包类调用(例如框架内部扩展点),可设为 protected
合理使用 default(包私有)划定协作边界
当某些辅助字段或工具方法不需要暴露给整个系统,但需要在模块内部(即同一包下多个类之间)共享时,不加任何修饰符(default)是最自然的选择。
立即学习“Java免费学习笔记(深入)”;
- 它比
private宽松,支持包内协作;又比public严格,阻止包外误用 - 比如一个工具类里的缓存 Map、内部状态标记,设为 default 能兼顾灵活性与封装性
避免常见破坏封装的行为
即使用了 private,也不代表封装就牢不可破。要注意:
- 不要在 getter 中返回可变对象的原始引用(如直接 return
new ArrayList(list)而不是list),否则外部仍能修改内部状态 - setter 中要校验参数合法性,不能无条件接受任意值
- 不要把本该 private 的字段误设为
public或protected,尤其在面向公众的 API 类中


















