private是封装安全的基石,编译器强制限制仅本类可访问,连同包子类均不可见;所有敏感状态必须私有化,且setter须校验、getter应脱敏,构造器是唯一可绕过setter的合法初始化入口。

访问修饰符是 Java 封装落地的底层机制,不是抽象概念,而是编译器强制执行的可见性规则。它通过限制“谁能在哪访问什么”,从源头切断非法数据触达路径,让模块边界真正可信赖。
private 是封装安全的基石
字段或方法一旦声明为 private,连同包下的其他类、子类、外部调用方都完全无法访问——编译器直接报错,不是运行时拦截。这不是靠约定,是语法级硬约束。
- 所有敏感状态(如账户余额、密码哈希、设备唯一标识)必须用 private 声明
- 禁止在 private 字段上提供无校验的 public setter;哪怕只读,也应通过 getter 控制返回逻辑(例如脱敏后返回)
- 构造器中对 private 字段的初始化,是唯一可绕过 setter 校验的合法入口,因此必须在此做初始值合法性检查
public 只用于定义契约,不暴露实现
public 方法不是“开放一切”的许可,而是对外承诺的稳定接口。它的存在意义是:告诉外界“你能做什么”,而不是“你该怎么操作我的内存”。
- public 方法内部可自由重构逻辑(比如把计算从 if-else 换成策略模式),只要输入输出行为不变,调用方就无需改动
- 绝不把 private 字段直接作为 public 方法的返回值暴露(如 return this.list),否则外部可绕过封装修改内部集合;应返回副本或不可变视图
- 构造器设为 public,仅表示该类允许被实例化;不代表其内部字段可被访问
protected 和默认修饰符用于受控协作
protected 允许子类继承并复用父类能力,但仅限于继承关系内;默认(包私有) 则限定在模块/包内协作——两者都不是为了放宽封装,而是划定更细粒度的信任域。
立即学习“Java免费学习笔记(深入)”;
- protected 方法应有明确的扩展点设计意图,避免子类误用导致状态不一致(例如父类 balance 字段是 private,但 protected 的 onBalanceChanged() 回调可被子类监听)
- 同包内工具类可使用默认修饰符访问核心类的非敏感辅助方法,但这些方法本身不能破坏封装(如格式化工具方法,不修改对象状态)
- 跨包调用必须走 public 接口;若发现需要频繁跨包访问 protected 成员,说明包结构或职责划分有问题
权限最小化原则是安全底线
Java 不提供“只读 public 字段”或“条件性 private”这类柔性控制。所以必须坚持:能用 private 就不用 protected,能用默认就不升 public,能不暴露就不加 getter。
- 没有业务需求的字段,不要写 getter/setter;暴露即风险
- setter 方法必须包含校验(如非空、范围、格式),失败时抛出明确异常(IllegalArgumentException),不静默失败
- IDE 自动生成的 getter/setter 只是起点,不是终点;每个 public 访问器都要回答一个问题:“这个暴露是否必要?有没有更安全的替代方式?”


















