JLS第6.6节明确定义访问修饰符:public对所有类可见;protected限同包及不同包子类(仅通过继承访问);private仅限声明类内部;默认(package-private)仅限同包。

Java语言规范(JLS)第6章标题为 “Names and Identifiers”,并不定义访问修饰符。
访问修饰符(public、protected、private)的严格定义不在第6章,而在 JLS 第 8 章(Classes)和第 9 章(Interfaces)中,尤其是第 6.6 节 “Access Control” —— 这才是 JLS 中专门、系统、权威阐述访问控制规则的核心章节。
以下是 JLS(以最新版 Java 21 对应的 JLS §6.6 为准)对访问修饰符的关键定义要点:
6.6 节 “Access Control” 的核心原则:
立即学习“Java免费学习笔记(深入)”;
- 访问控制决定一个声明(如字段、方法、嵌套类、构造器)是否可被另一个类中的代码所引用;
- 是否可访问,取决于两个因素:
• 声明所在的类型(class/interface/record/enum)及其包;
• 引用该声明的代码所在的位置(同一类?同一包?子类?任意位置?);
各修饰符的语义(JLS §6.6.1–§6.6.4 明确定义):
-
public:声明对所有类可见,无包或继承限制; -
protected:对同一包内所有类可见;且对不同包中的子类可见(注意:仅限通过继承访问,不能通过外部对象引用受保护成员); -
private:仅对该声明所在的顶层类或嵌套类的内部可见(即:外层类无法直接访问内层私有成员,但嵌套类可访问其外围类的 private 成员); -
默认(即不写任何修饰符,也称 package-private 或 package-access):仅对同一包内的类可见;与
protected的关键区别在于:它不向子类开放跨包访问权。
特别强调(常被误解):
-
protected不等于 “对子类公开” —— 它要求子类必须在同一包,或虽在不同包但通过继承关系访问自身继承而来的成员(不能通过父类实例引用super.parentField以外的方式间接访问其他子类对象的 protected 成员); - 接口中的所有成员(方法、字段)默认为
public,即使未显式写出(JLS §9.3、§9.4); - 抽象类中的成员遵循与普通类相同的访问规则,
abstract本身不是访问修饰符,不参与可见性控制; -
final、static、synchronized等属于非访问修饰符,JLS 将它们归入“modifiers”大类,但访问控制逻辑只由public/protected/private/package-private 决定。
简言之:JLS 并未把访问修饰符塞进“名字与标识符”范畴,而是将其作为程序语义与封装机制的基础规则,放在第 6.6 节独立精确定义。想查权威依据,直接翻 JLS §6.6(https://www.php.cn/link/9a5d620fa8f42447aa81f8133866cff1),比任何二手总结都可靠。


















