java内部类的访问修饰符决定其可见性:public可被任意类访问,protected限同包及外部类子类,default仅同包可见,private仅外部类自身可访问。

Java 中内部类的访问修饰符直接决定它对外部代码的可见性,和普通成员(如字段、方法)一样,可用 public、protected、default(包私有)、private 四种修饰符,关键在于明确“谁”能访问、“怎么访问”。
内部类的修饰符作用范围
内部类属于外部类的成员,因此它的访问控制逻辑与字段/方法一致:
-
public:任何类都能访问,只要能拿到外部类实例,就能创建或引用该内部类(需通过
Outer.Inner形式) -
protected:同包类 + 不同包的子类可访问(注意:子类必须继承外部类,且通过
super.new Inner()或自身实例创建) - default(不写):仅同一包内的类可访问,跨包即不可见,哪怕有继承关系也不行
- private:仅外部类自身内部可定义、实例化、访问;外部类的其他方法、静态上下文、甚至同包其他类都不可见
外部类如何访问自己的内部类
外部类访问内部类不受修饰符限制——无论 private 还是 public,外部类总能自由使用。但调用方式有区别:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 非静态内部类(成员内部类)需依赖外部类实例:
new Outer().new Inner() - 静态内部类(static class)可直接通过类名访问:
new Outer.Inner(),但前提是该内部类不是 private - private 内部类只能在外部类内部 new 实例,不能被外部类的静态方法以外的方式暴露出去(比如不能作为 public 方法的返回类型)
常见控制场景与写法
根据封装需求选择合适修饰符:
- 想完全隐藏实现细节(如辅助计算类、临时状态容器)→ 用 private 内部类
- 希望同包内协作类复用该内部类逻辑 → 用 default(不加修饰符)
- 需要被子类扩展(如模板方法中可重写的内部行为)→ 用 protected
- 提供通用工具型内部类(如 Builder 模式中的 Builder 类)→ 用 public
特别注意的边界情况
有些行为容易误解,实际运行时受修饰符严格约束:
- 不同包的子类无法访问外部类的 private 或 default 内部类,即使继承了外部类
-
protected 内部类在不同包子类中,只能通过
this.new Inner()或super.new Inner()创建,不能用new Outer().new Inner()(父类实例在不同包不可见) - 内部类若为 static,则不持有外部类引用,但其访问权限仍由修饰符单独控制
- 匿名内部类和局部内部类不能加访问修饰符,其可见性由所在作用域决定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










