Java访问修饰符核心是包内可见性与子类可继承性:private仅本类,default同包,protected同包+不同包子类(限this/子类实例),public全局;类本身仅public或default(外部类)。

Java 访问修饰符是面试高频考点,核心在于理清“谁可以访问谁”——即作用域(scope)和继承关系两个维度。系统化归纳的关键不是死记表格,而是抓住 包内可见性 和 子类可继承性 这两条主线。
一、四个修饰符的作用域对比(按访问范围从小到大)
记住一个口诀:私有 → 默认 → 受保 → 公开,对应 private → (default) → protected → public。
- private:仅限本类内部访问。连同包下的其他类、子类(即使在同包)都不能访问。
- 默认(缺省,不写任何关键字):同包可见,与继承无关。不同包的子类无法访问,哪怕继承了该类也不行。
- protected:同包可见 + 不同包的子类可见(通过继承关系)。注意:不同包子类不能通过父类引用直接访问 protected 成员(如 parentObj.protectedField 是非法的),只能通过 this 或子类实例访问。
- public:全局可见,无限制。但受类本身访问权限约束(如 public 类中的 public 成员才真正全局可访)。
二、继承场景下的关键细节(面试最爱挖坑)
子类能否访问父类成员,取决于两层判断:父类成员的修饰符 + 子类与父类是否同包。
- 父类用 private 声明:子类完全不可见,也不能继承(虽然编译器会隐式调用 super(),但字段/方法不参与继承)。
- 父类用 默认 声明:子类只有和父类在同一包时才能访问;跨包则不可见,即便继承了也访问不到。
- 父类用 protected 声明:子类无论是否同包,都可通过 this 或子类对象访问(如 this.protectedMethod()),但不能通过父类引用访问(Parent p = new Child(); p.protectedMethod(); ❌)。
- 父类用 public 声明:子类可自由访问,无限制。
三、类本身的访问控制(常被忽略)
修饰符不仅用于成员,也用于类(外部类 & 内部类),规则不同:
- 外部类只能用 public 或 默认(不能用 private/protected);一个 .java 文件最多一个 public 类,且文件名必须与之相同。
- 内部类可使用全部四种修饰符:
– private 内部类:仅在外围类内部可用;
– protected 内部类:外围类及其子类可访问;
– 默认:同包内可访问;
– public:全局可访问(需通过外围类限定,如 Outer.Inner)。
四、实战记忆技巧与避坑提醒
- 画一张二维表:横轴是“访问者位置”(本类 / 同包其他类 / 不同包子类 / 不同包非子类),纵轴是修饰符,快速定位 ✅/❌。
- 牢记 protected 的真实含义是“包内 + 继承链可见”,不是“子类可见”。很多面试题故意构造跨包子类调用父类引用的场景来考察理解深度。
- 接口中的所有方法默认是 public abstract,字段默认是 public static final,即使不写也不能加其他修饰符。
- 重写(override)时,子类方法的访问权限不能比父类更严格(如父类是 protected,子类不能是 default 或 private),但可以更宽松(如父类 default,子类可改为 public)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











