封装的核心是分层控制可见性:类层面用public或默认修饰符限定访问范围;成员层面依意图选用private、protected、默认或public;包结构需配合修饰符实现模块内高内聚、对外低耦合。

封装的核心是“把不该暴露的藏起来,把该用的接口留出来”,而访问权限修饰符就是实现这一目标的语法工具。它不单是加个 private 就完事,而是要结合类的设计意图,在类、成员、包三层上协同控制可见性边界。
类本身可见性:决定谁能“看到这个类”
顶级类只有两种合法可见性:public 或 默认(包私有)。
-
public 类:必须独占一个 .java 文件,且文件名与类名严格一致;其他包要使用它,必须 import 或写全限定名。适合对外提供稳定 API 的入口类(如
java.util.ArrayList)。 - 默认类:天然不可被其他包 import,哪怕它内部有 public 方法也不行。适合包内协作的工具类、DTO、Builder 等——别人用不到,也找不到。
成员可见性:决定“看到之后能用什么”
字段和方法的修饰符决定了外部代码对类内部细节的触达深度:
- private 成员:只在本类内可读写。这是封装的底线,比如敏感状态、缓存、内部计数器。外部必须通过 public getter/setter 或行为方法间接操作。
-
protected 成员:不是“给子类专用”,而是“同包任意类 + 跨包子类”都可访问,但方式不同。子类可用
super.xxx或自身实例调用;同包非子类只能用对象实例调用,不能继承或重写。适合设计可扩展的基类(如 AWT 组件)。 - 默认成员:仅限本包,不随继承传递。子类即使跨包继承了父类,也无法访问父类的 default 字段。适合模块内高内聚协作,比如 Spring 框架中大量 package-private 工具类。
- public 成员:意味着承诺长期兼容。一旦发布,修改签名或删除就可能破坏调用方。应只暴露真正需要被外部直接使用的接口。
包结构配合:让 default 和 protected 发挥实效
访问修饰符的效果高度依赖包组织方式:
- 把逻辑相关的类放在同一包里,才能放心用 default 修饰成员——既避免暴露给外界,又方便内部高效协作。
- 若希望子类能复用父类能力,但又不想让无关类随意调用,就把父类设为 public,关键扩展点用 protected 声明。
- 避免“一个包里全是 public 类”,那等于放弃了包级封装;也别把所有字段都 private 却不提供任何访问途径,那封装就失去了实用性。
封装不是锁死,而是分层暴露
真正的封装不是拒绝访问,而是控制访问路径:
- 用 private 封装数据,用 public 方法封装行为(比如
setAge(int age)内部做范围校验)。 - 用 protected 暴露钩子(hook),让子类定制逻辑,但不开放底层实现细节。
- 用 default 隐藏模块内部契约,只通过 public 接口与外界交互。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











