包私有权限核心是“同包可见、跨包屏蔽”,即不写修饰符时成员仅本类及同包类可访问,跨包(含子类)不可访问,适用于模块内协作且需封装边界的场景。

包私有权限(即默认访问权限,不写任何修饰符)控制访问范围的核心是“同包可见、跨包屏蔽”——它不靠关键字声明,而是靠省略修饰符来实现一种轻量但明确的封装边界。
包私有权限的生效范围
一个成员(字段、方法、构造器)或顶层类被设为包私有时,仅允许以下位置访问:
- 声明它的那个类内部(本类可自由使用)
- 同一包下的其他任意类(无论是否继承关系)
- 不允许不同包中的任何类访问,包括子类、工具类、测试类
怎么正确使用包私有类和成员
包私有适用于模块内协作场景,比如订单模块中多个类需共享校验逻辑或配置常量:
- 把 OrderValidator、OrderEventPublisher 和 OrderConstants 放在同一个包下
- 让 OrderConstants 中的配置字段不加修饰符:
static final int MAX_RETRY = 3 - 将辅助方法如
isValidAmount()设为包私有,避免暴露给外部模块 - 顶层类如
InternalHelper不加public,就自动成为包私有,只能被同包类实例化
常见误区与注意事项
包私有不是“弱 public”,也不是“半 protected”,它有明确的边界限制:
立即学习“Java免费学习笔记(深入)”;
- 子类即使继承了包私有父类,一旦不在同一包,就无法访问其包私有成员
- 不能用反射绕过包私有检查(JVM 运行时不强制,但编译期已拒绝跨包引用)
- 接口不能用包私有修饰,接口本身若不写
public,则整个接口不可被跨包使用 - 包私有字段不建议直接暴露,仍应配合包内统一的访问方法,便于后续加日志或校验
对比其他权限来理解包私有定位
它是介于 private 和 protected 之间的协作层:
-
private:只给自己用,连同包都不行 -
包私有:只给“自己人”(同包)用,不对外也不对子类无条件开放 -
protected:除了同包,还主动向子类让渡部分能力 -
public:完全开放,承担契约责任


















