java四种访问修饰符的可见性边界取决于调用位置与继承关系:public全局可访(需import)、protected允子类及同包访问、default仅限本包、private仅本类(含内部类特例)。

Java 的四种访问修饰符不是简单地“谁能不能用”,而是明确划定“在哪儿能用”——关键看调用位置(本类、同包、跨包)和继承关系(是否子类)。它们的可见性边界由编译器在编译期强制检查,不依赖运行时环境。
public:全局可见,但依赖 import 和类可加载性
public 成员可在任意包、任意类中访问,前提是:目标类本身能被加载(即类路径正确、包名匹配),且调用方通过 import 或全限定名引用该类。否则会报 cannot find symbol。
- public 类必须独占一个 .java 文件,且文件名与类名严格一致
- 接口中方法默认 public,显式声明 redundant
- 子类重写 public 方法时,不能降级为 protected 或 private
protected:子类 + 同包,但访问方式有区别
protected 允许两类主体访问:同一包内任意类;不同包中的子类。但二者权限不对等:
- 子类(无论同包或跨包)可通过 super 或自身实例调用父类 protected 成员
- 同包非子类只能通过对象实例访问(如
obj.protectedMethod()),不能继承、不能重写、也不能用 super 调用 - 跨包子类无法通过父类实例调用其 protected 成员(如
parent.protectedMethod()编译失败)
default(无修饰符):纯包级可见,不穿透继承
default 是真正的“包私有”,只对当前 package 内所有类开放,与继承无关:
- 跨包的子类即使继承了 default 类,也无法访问其 default 成员
- default 类本身不能被其他包 import,哪怕它内部有 public 方法也不行
- 适合包内协作逻辑(如解析工具、DTO 构建器)、测试友好但不对外暴露的实现
private:本类封闭,内部类是唯一例外
private 成员仅在声明它的最外层类内部可访问,连直接子类都不可见:
- 子类无法继承、无法重写、无法访问 private 方法或字段
- static 或非 static 内部类可以自由访问外围类的 private 成员(这是语言特例)
- JDK 9+ 模块系统下,反射默认禁止访问 private 成员,需显式
--add-opens











