Java封装不单靠包结构控制访问权限,而是包与访问修饰符协同实现:default权限限于同包访问,protected需包+继承双重条件,public类强制包路径匹配,private则为本类私有底线。

Java 封装本身不直接“通过包结构控制类的访问权限”,但包结构与访问修饰符协同作用,共同实现封装目标。关键在于:包是 default(包级私有) 和 protected 权限生效的前提,而封装的核心逻辑——隐藏实现、暴露接口——正是靠这些权限在包边界上落地的。
包结构决定了 default 权限的作用范围
当一个类、方法或字段不写任何修饰符(即使用 default 权限)时,它只能被同一个包内的其他类访问。这意味着:
- 把一组紧密协作、无需对外暴露的工具类、内部实体类放在同一个包里,用 default 修饰其构造器或方法,外部包就无法直接实例化或调用;
- 例如:
com.example.order.internal包下定义OrderValidator类,不加 public,其他包即使 import 也无法 new 它或访问其默认方法; - 这比全用 public + 注释说明“请勿调用”更可靠——编译器直接拦截,不是靠约定。
protected 需要包 + 继承双重条件才能跨包访问
protected 成员既允许同包访问,也允许不同包的子类访问。包结构在这里起到“分组隔离”作用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类
com.example.core.ServiceTemplate中声明protected void doExecute(); - 子类
com.example.payment.PaymentService可以重写该方法,哪怕它在不同包中; - 但同为
com.example.report.ReportGenerator(非子类、不同包)则完全不可见; - 这样既支持框架扩展(子类定制),又防止无关模块随意调用内部流程方法。
public 类必须与包路径严格匹配,强化模块边界
一个类若声明为 public,它的文件名必须与类名一致,且必须放在对应包路径的目录下。这种强制约束本身就是封装设计的一部分:
立即学习“Java免费学习笔记(深入)”;
- 比如
public class UserService必须位于com.example.user.UserService.java; - 使用者通过
import com.example.user.UserService明确依赖路径,避免“裸类名”导致的命名冲突和引用混乱; - 包名成为 API 的一部分,升级时改包名即视为不兼容变更,倒逼开发者思考模块职责是否清晰。
private 是封装的底线,包结构不影响它,但能辅助组织
private 成员永远只在本类内可见,和包无关。但它和包结构配合能提升封装质量:
- 把高内聚的类(如
TokenGenerator和它的private byte[] secretKey)放在同一包内,便于用 default 方法协调行为,同时保持核心字段绝对私有; - 包结构帮助你识别哪些类该共享内部逻辑(用 default)、哪些只需暴露统一入口(public 方法 + private 实现);
- 没有合理的包划分,private 字段再多,也可能因类职责过杂而破坏封装意图。

















