Java访问修饰符是封装的核心工具,private强制隐藏字段并预留校验空间,public getter/setter提供受控访问,protected和default支持继承或包内协作,public仅用于明确对外契约。

Java 中访问修饰符是封装落地的关键工具,它们不是孤立的语法符号,而是直接服务于“隐藏内部实现、暴露可控接口”这一核心原则。配合得当,才能真正守住数据边界。
private 是封装的基石
所有敏感属性必须用 private 修饰,这是强制性的第一步。它切断外部对字段的直连通道,让数据无法被绕过逻辑随意修改。
- 比如用户年龄不能为负数,设为
private int age;后,外部就无法写user.age = -5; - 私有字段只能在本类中读写,这就为校验、转换、日志等附加逻辑留出了空间
- 即使子类或同包类也不能访问,彻底隔绝非授权路径
public getter/setter 构成安全出口
仅靠 private 不够,还得提供受控的访问方式。通常通过 public 的 getter 和 setter 方法对外暴露能力,但方法体里可以嵌入业务规则。
- setter 中可做参数校验:
if (age 150) throw new IllegalArgumentException(); - getter 可返回副本(如
return new ArrayList(list);),避免外部修改原始集合 - 某些字段只读,就只提供 getter;某些字段只写,就只提供 setter
protected 和 default 用于分层协作
当需要在继承体系或包内协作时,protected 和 default 提供了比 private 更宽松、又比 public 更收敛的中间选择。
立即学习“Java免费学习笔记(深入)”;
-
protected允许子类访问父类关键状态,比如父类定义protected String status;,子类可基于它扩展行为,但外部包仍不可见 -
default(不写修饰符)适合同一包内的组件协同,比如 DAO 层几个类共享一个内部工具方法,不希望被其他包调用 - 二者都不破坏封装本质——只是把“可控接口”的范围从单个类扩大到子类或包级单元
public 要谨慎暴露,只留给真正需要的契约
public 是最开放的权限,应只用于明确设计为对外服务的类、方法或常量。滥用 public 会快速瓦解封装边界。
- 工具类中的通用方法(如
StringUtils.isEmpty())可设为 public - 对外提供的 API 接口方法必须 public,但其内部仍应依赖 private 字段 + 校验逻辑
- 绝不把业务核心字段(如账户余额、密码哈希值)直接声明为 public


















