private修饰符通过编译期强制拦截实现数据保护,拒绝类外任何直接访问并报错;强制通过setter/getter校验与脱敏;隔离继承与包内访问边界;配合final和不可变返回防范引用类型篡改。

private 修饰符通过编译期强制拦截实现数据保护,不是靠约定或运行时检查,而是让非法访问在代码写完那一刻就无法通过编译。
编译器直接报错,切断所有直连路径
只要代码出现在类定义的大括号之外,哪怕只是同包、子类、甚至同一文件里的另一个类,只要尝试 obj.field 或 obj.method(),Javac 就会拒绝编译,提示类似 error: private access 或 cannot find symbol。这种限制不依赖 JVM 运行时,也不留绕过余地(反射属于破坏性操作,不在设计意图内)。
强制走可控入口,校验逻辑不被跳过
把字段设为 private 后,外部无法绕过业务规则直接赋值。所有修改必须经过 setter,你可以在里面加校验:
- 比如
setAge(int age)中写if (age 150) throw new IllegalArgumentException(); - getter 也可做脱敏(如返回星号掩码)、空值转换、懒加载等,而不是裸露原始值
- 没有 private,
user.age = -10这种语句就能合法执行,校验形同虚设
隔离继承与协作边界,避免意外干扰
private 字段不会被子类继承,也不能用 super.field 访问;同包其他类同样无权触碰。这意味着:
- 父类内部状态不会被子类误改或覆盖
- 包内协作不会因“反正同包”就放松数据约束
- 每个类的数据边界清晰,修改不影响调用链上其他模块
配合 final 和不可变返回,堵住引用类型漏洞
仅 private 不足以防所有篡改,尤其对 List、Map 等引用类型:
- 外部虽不能重赋值,但能调用
getList().add(...)修改内部内容 - 应改为 getter 返回副本(
new ArrayList(list))或不可变包装(Collections.unmodifiableList(list)) - 对于对象字段,考虑用
record或返回只读接口,避免暴露可变状态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











