封装通过隐藏内部数据和控制访问入口保护数据,即用private限制直接访问,以getter/setter校验逻辑、限制读写,并防御可变对象引用泄露及构造器数据校验。

封装通过“隐藏内部数据 + 控制访问入口”的方式来保护数据,不是靠加密或权限系统,而是靠语言机制和设计约束。
把属性设为 private 是第一步
Java 中用 private 修饰成员变量,就切断了外部直接读写的可能性。比如:
private String idCard;
外部代码不能写 person.idCard = "123";,编译直接报错。这从源头阻止了非法赋值和随意窥探。
用 getter/setter 做可控的中转站
不提供直接访问,但可以提供方法来间接操作——关键在于这些方法里能加逻辑:
- setAge(int age) 中判断是否在 0–150 范围,超限就拒绝或抛异常
- setName(String name) 中检查非空、长度、敏感词等
- getSalary() 可以加权限判断:当前用户是否有权查看薪资
- 有些字段只提供 getter(如身份证号),做到“可读不可写”
避免暴露可变对象引用
如果私有属性是数组、List、Date 等可变类型,直接返回引用可能被外部修改,破坏封装。正确做法是:
- 返回副本:return new ArrayList(this.items);
- 返回不可变视图:return Collections.unmodifiableList(this.items);
- 对 Date 类型,用 clone() 或转换为 long 时间戳再返回
构造器也要做校验
对象一创建就得守住数据底线。比如:
public Person(String name, int age) {
if (name == null || name.trim().isEmpty()) throw new IllegalArgumentException();
if (age this.name = name;
this.age = age;
}
这样即使绕过 setter,也无法构造出非法状态的对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











