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

Java 中四种访问修饰符的可见性边界在哪
它们不是“能不能用”,而是“在哪儿能用”——关键看调用位置和继承关系。同一个类里全都能用,真正分水岭在类外、包外、子类这三重空间。
public 为什么几乎总能被访问到
public 成员能被任何地方访问,但要注意:它不解决“类能否被加载”的问题。比如 public class Utils 放在默认包里,其他包即使用 public 方法也 import 不进来。
- 跨包调用必须配合
import(或全限定名),否则编译报错cannot find symbol - 子类继承
public方法后,重写时仍需声明public,不能降级为protected - 接口里的方法默认就是
public,显式写反而冗余
protected 在子类和同包中的微妙区别
protected 允许子类访问,也允许同包内非子类访问——但这两者权限不等价。子类能通过 super 或实例调用父类 protected 成员;而同包非子类只能通过对象实例访问,不能直接继承或重写。
- 子类在不同包中:可访问父类
protected字段/方法,但不能访问父类对象的protected成员(除非是自身实例) - 同包非子类:可访问本包内任意类的
protected成员,哪怕没继承关系 - 常见错误:以为
protected= “只给子类用”,结果在同包子类外误调用,编译通过但语义混乱
default(包私有)和 private 的实际影响范围
default(不写修饰符)只对本包可见,连子类跨包都不行;private 只限本类内部,连子类都不可见——但要注意,内部类可以访问外围类的 private 成员,这是特例。
-
default类不能被其他包 import,哪怕加了public方法也没用 -
private方法无法被反射绕过访问(JDK 9+ 模块系统下,默认禁止反射访问private,除非加--add-opens) - 测试类常被误放错包:想测
default方法,却把测试类放在其他包,结果编译失败
真正容易被忽略的是:访问修饰符只控制编译期可见性,运行时一切照旧。比如反射、序列化、模块系统都会重新定义“可见”的边界,这时候 private 不再绝对私有,default 也可能被打破。










