静态内部类可直接通过“外部类名.内部类名”创建,无需外部类实例;它不持有outer.this引用,仅访问外部类静态成员,编译后为独立class文件,适用于工具类、builder等场景。

静态内部类可以直接通过“外部类名.内部类名”语法创建,无需先实例化外部类。
创建方式很简单
只要外部类已加载,就能直接 new 出静态内部类对象:
-
正确写法:
Outer.StaticInner obj = new Outer.StaticInner(); -
错误写法:
Outer outer = new Outer(); Outer.StaticInner obj = outer.new StaticInner();(普通内部类才这么写) - 如果静态内部类是
private,只能在外部类内部创建;public则可在任意有访问权限的地方创建
为什么能独立创建
因为静态内部类在编译后生成独立的 Outer$StaticInner.class 文件,它不持有对外部类实例的隐式引用,本质上更像一个“寄居在外部类命名空间里的顶级类”。
- 它只依赖外部类的 类定义,不依赖外部类的 对象实例
- JVM 加载
Outer.class时,Outer$StaticInner.class可随时被加载和实例化 - 没有
this$0字段(这是普通内部类持有的外部类引用字段)
使用时要注意访问限制
虽然创建独立,但它的能力受访问规则约束:
- 可直接访问外部类的 所有静态成员(包括
private static字段和方法) - 无法直接访问外部类的 非静态成员(如普通字段、实例方法),否则编译报错
- 若真需访问实例成员,必须显式创建外部类对象,再通过该对象调用,例如:
new Outer().instanceMethod()
典型适用场景
当你需要一个逻辑上属于外部类、但又不依赖其具体对象的辅助类时,就适合用静态内部类:
- 封装与外部类强相关但无状态的工具类(如
Person.Home、Map.Entry) - 实现单例或共享配置对象,多个外部类实例共用同一个静态内部类对象
- 避免命名污染,又不想把类提到包一级(比如只在本类中使用的 DTO 或 Builder)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











