Java封装通过访问修饰符划定协作边界:private为内层防线,default限同包,protected供继承体系,public为对外契约。各修饰符语义明确,共同保障安全性、可维护性与扩展性。

封装在 Java 中不是把数据“锁起来”,而是用访问修饰符划出清晰、可预期的协作边界——谁该看到、谁不该看到、谁可以改、谁只能读,全由修饰符语义决定。
private:安全边界的最内层防线
字段和辅助方法默认都应设为 private。它不只防止外部直接赋值,更关键的是切断所有绕过校验逻辑的路径。比如账户余额字段设为 private 后,外部无法写 account.balance = -100,必须走 deposit() 或 withdraw() 方法,在其中做正负判断、额度检查、日志记录等。
- 所有状态字段(如 password、score、status)优先 private
- 校验、格式化、解析等仅本类调用的逻辑方法也应 private
- 构造器设为 private 可用于单例、工厂封装或禁止非法实例化
- 注意:内部类可访问外围类的 private 成员,这是语言允许的例外
default(包级私有):模块协作的天然分界线
不加任何修饰符时,成员仅对同包类可见。这不是“没写就随便用”,而是明确表达:“这些能力只供本模块内部高效协作,不对外承诺”。比如订单模块中 Order、OrderItem、OrderValidator 同属 com.example.order 包,它们之间用 default 方法共享校验规则或状态转换逻辑,但其他业务包完全感知不到。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合工具类中的静态辅助方法(如
DateUtils.formatLocalDateTime()) - DTO 构建器、序列化适配器等内部实现类常设为 default
- 测试类(test 目录下同名包)能直接访问 default 成员,便于白盒验证
- default 类本身不能被其他包 import,哪怕它有 public 方法也不行
protected:留给继承体系的受控通道
protected 不是“半公开”,而是“家族权限”——它同时向同包类和跨包子类开放,但访问方式不同:同包类可通过实例调用;子类则通过 this 或 super 使用,且不能通过父类引用调用(如 new Parent().hook() 编译失败)。这确保了扩展点稳定,又避免被随意滥用。
立即学习“Java免费学习笔记(深入)”;
- 模板方法模式中的钩子方法(如
beforeSave()、afterRender())适合 protected - 希望子类复用但不希望外部调用的计算逻辑,可用 protected 方法封装
- 慎用 protected 字段——它会把子类和父类的内部结构强耦合,优先用 protected 方法替代
- 不要为方便测试而设为 protected;测试应走 public 接口,或用反射(仅限必要场景)
public:对外契约的唯一出口
public 是系统与外界的正式约定,意味着稳定性、语义清晰和责任明确。它不是“能用就放出来”,而是“必须提供且长期兼容”。比如 Service 接口方法、Controller 入口、工具类主函数。每个 public 方法都要承担守门人职责:校验参数、处理异常、触发事件、维护不变量。
- POJO 的 getter/setter 通常 public,但 setter 可考虑用 Builder 模式或不可变对象替代
- 永远避免 public 字段(static final 常量除外),所有访问必须经由方法封装
- 接口方法默认 public,实现类对应方法也必须 public,且重写时不能降级
- public 方法签名一旦发布,就代表承诺;修改需兼容或版本升级

















