缺省修饰符指不加任何访问修饰符时的默认访问级别,仅同一包内类可访问,适用于包内协作场景,如工具类辅助方法或模块内部状态管理。

Java 中的“缺省”(也叫默认、package-private 或不写修饰符)不是关键字,而是指成员(变量、方法、内部类)或顶层类**不加任何访问修饰符**时的自然访问级别。它既不是 public,也不是 protected 或 private,而是一种隐式限定:仅对同一包内的所有类开放。
缺省修饰符的作用范围
缺省权限只允许以下三类访问:
- 本类内部:当然可以自由访问
- 同一包下的其他类(必须是完全相同的包路径,不含子包)
- 同一包下的内部类或匿名类
它不允许被不同包中的子类访问(这点和 protected 不同),也不允许被不同包中的任意类访问(这点和 public 不同)。
什么时候该用缺省修饰符
适合封装“包内协作”的实现细节,既保持一定封装性,又避免过度暴露。常见场景包括:
- 工具类中仅供本包使用的辅助方法,比如
StringUtils.formatInternal() - 包内共享的状态管理类,如
ConnectionPool的核心调度逻辑 - 模块化设计中,将一组紧密耦合的类放在同一包里,用缺省修饰符限制它们之间的协作边界
- 测试友好:同一包下的测试类可直接调用缺省方法,无需反射或 public 暴露
怎么写才是缺省?注意事项
写法很简单:什么也不加。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
例如:
class DatabaseHelper {int connectionTimeout = 3000;
void initConnection() { /* ... */ }
}
上面的字段 connectionTimeout 和方法 initConnection() 就是缺省权限。
注意几个关键点:
- 顶层类也可以是缺省的(即不写
public),此时该类只能被同包类使用;一个 .java 文件里最多一个public类,其余类自动为缺省 - 子类重写父类方法时,不能把
protected方法改成缺省——因为访问权限只能扩大,不能缩小 - 接口中的成员不能用缺省修饰符(会编译报错),接口方法默认就是
public abstract - 构造器可以用缺省修饰符,常用于限制实例化范围,比如只允许同包子类或工厂类调用
缺省 vs private vs protected 的直观区别
假设你在 com.example.service 包里定义了一个类:
-
private void helper()→ 只有本类能调 -
void helper()(缺省)→ 本包所有类都能调,跨包不行,子类在别处也不行 -
protected void helper()→ 本包 + 所有子类(哪怕在别的包)能调
选缺省,就是想说:“这事只在咱们这个小团队里办,不对外招人。”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










