private 修饰符通过编译期硬性拦截实现封装,禁止类外直接访问字段,强制通过受控的 getter/setter 进行读写,配合 final 和不可变返回值可进一步防止篡改。

Java 中用 private 修饰成员变量,本质是靠编译器强制拦截——不是靠约定、不是靠文档提醒,而是直接报错。
编译期硬性阻断
private 字段在类外部(包括同包其他类、子类、任意调用方)一旦出现直接读写,比如 obj.field = value 或 int x = obj.field,Javac 就会拒绝编译,提示 error: cannot find symbol 或 error: private access。这种防护不依赖运行时检查,也不留绕过余地。
切断直连路径,只留逻辑入口
- 没有 private,外部就能跳过校验直接赋值:比如把
age设成 -10 或 999 - 有了 private,所有修改必须走 setter 方法,而 setter 里可以加校验:
if (age 150) throw new IllegalArgumentException(); - getter 同样可控:可做空值转换、脱敏处理、懒加载等,而不是裸露原始值
隔离继承与跨包干扰
子类无法继承 private 字段,也不能通过 super.field 访问;同包其他类也无权触碰。这意味着:
- 父类字段状态不会被子类意外覆盖或误改
- 包内协作不会因“反正同包”就放松数据约束
- 每个类的数据边界清晰,修改不影响调用链上其他模块
配合 final 和不可变返回进一步加固
仅 private 不足以防所有篡改,尤其面对引用类型:
立即学习“Java免费学习笔记(深入)”;
-
private static List<string> list = new ArrayList();</string>—— 外部虽不能重赋值,但能调用list.add() - 应改为
private static final List<string> list = Collections.unmodifiableList(...);</string> - getter 返回副本或不可变包装,避免暴露可变内部状态


















