java访问修饰符考察深度:default限同一package声明(不含子包),protected允本类、同包及不同包子类(仅继承访问),private仅本类,static内部类不可访问外部非static private成员。

Java 访问修饰符看似简单,但面试官常通过细节、边界场景和设计意图来考察深度。想拿满分,不能只背“public > protected > default > private”,要讲清作用域、继承影响、包关系、编译期检查逻辑,并能结合代码快速判断可访问性。
一、四类修饰符的作用域必须说准(带具体范围)
很多候选人把 default 说成“包内”,但准确说法是:同一编译单元(即同一个 package 声明下的类),不跨子包。例如 com.example.util 中的 default 方法,com.example.util.sub 的类无法访问——哪怕父子包关系也不行。
protected 是高频失分点:它允许本类、同包所有类、不同包的子类(仅通过继承方式访问)。注意“不同包子类”不能直接通过对象引用访问父类的 protected 成员(如 super.parentField 可以,new Parent().parentField 编译报错)。
二、用对比表格现场画出来(边说边列)
面试时主动画个简表,体现思考过程:
- public:任何地方,无限制
- protected:本类 + 同包 + 不同包子类(继承链中可用,非对象调用)
- default(包级私有):仅限同一 package 声明下,子包不算同包
- private:仅本类内部,连子类都不行(构造器 private 是单例关键)
三、结合真实场景解释“为什么这样设计”
比如被问“为什么 protected 允许不同包子类访问,却不允许同包子类以外的对象访问?”——这是为了支持受控的继承扩展:框架作者希望子类能复用/重写某些能力(如 java.util.AbstractList 的 modCount 是 protected),但又不希望外部任意代码随意修改内部状态。
再如“接口中方法默认 public,字段默认 public static final”——因为接口本质是契约,不封装实现,所有成员天然对外可见且不可变,符合“定义标准”的语义。
四、必答陷阱题:嵌套类对访问修饰符的影响
静态内部类(static nested class)只能访问外部类的 public / protected / default / static private 成员(非 static private 不行);而非静态内部类(inner class)可直接访问外部类所有成员(包括 private),因为它持有外部类实例引用。
举例说明:
class Outer { private int x = 1; static class StaticInner { void m() { /* 不能访问 x */ } } class Inner { void m() { System.out.println(x); // ✅ 可访问 } } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











