选对权限修饰符需按需收紧:优先private封装内部细节;需子类扩展用protected;对外提供能力用public;包内协作用default。

选对权限修饰符,关键看“谁要用、在哪用、要不要被改”。不是越开放越好,也不是越私有越安全,而是按需收紧——从 private 起步,只在必要时逐步放宽。
优先用 private:封装数据和内部逻辑
字段和辅助方法默认都该是 private。它不参与继承,也不对外暴露,能彻底隔绝误用和意外修改。
- 比如用户密码、缓存计数器、校验用的工具方法,只在本类内调用,就该用 private
- 即使子类想复用,也不该直接访问——父类应提供 protected 或 public 的接口来间接支持
- JavaBean 规范也明确要求属性必须 private,靠 getter/setter 控制读写
需要子类扩展?用 protected
protected 是为继承设计的权限。它允许子类在自身方法中调用和重写,又阻止无关类随意调用。
- 模板方法模式中的钩子方法(如
beforeSave())、可定制的计算逻辑,适合声明为 protected - 子类重写 protected 方法时,权限可以升级为 public,但不能降级为 default 或 private
- 注意:protected 不代表“子类对象能直接调用”,而是“子类代码里能用”——这点常被误解
对外提供能力?用 public
public 成员构成类的稳定契约,所有使用者(包括跨包调用、框架反射、测试代码)都依赖它。
- API 方法、构造器、核心业务入口,必须是 public
- 重写 public 方法时,子类只能保留 public,改小会编译失败(Cannot reduce the visibility)
- 一旦发布为 public,后续就不能轻易收缩,否则破坏兼容性
包内协作?用 default(不加修饰符)
没有修饰符的成员,天然限于同包可见。适合模块内部解耦,又不想暴露给外部使用者。
- 工具类里的中间方法、包级策略实现类、测试辅助逻辑,用 default 很合适
- 跨包子类无法访问 default 成员,更谈不上重写;同包子类可继承并重写(权限可升为 protected 或 public)
- 比 protected 更收敛,比 private 更灵活,是“包级封装”的主力

















