静态内部类不依赖外层类实例,可直接通过“外层类名.静态内部类名”创建对象;仅能访问外部类静态成员,反射加载用“outer$staticinner”格式,且其静态方法调用规则与普通静态类一致。

静态内部类天生就不依赖外层类实例,这是由 static 修饰符决定的——它切断了与外部类对象的绑定。只要知道类名,就能直接创建实例或调用静态成员,无需任何外围对象。
静态内部类的实例化方式
直接通过“外层类名.静态内部类名”来 new 实例,不涉及外部类对象:
-
语法简洁明确:例如
Outer.StaticInner obj = new Outer.StaticInner(); -
不需先创建 Outer 实例:对比非静态内部类必须写
new Outer().new Inner(),这里完全跳过这一步 - 可出现在 static 上下文中:比如在 main 方法、静态工具方法里直接使用,无任何限制
静态内部类访问外部类成员的规则
它只能直接访问外部类的静态成员(包括 private static),访问非静态成员必须显式创建外部类实例:
-
合法访问:
Outer.staticField、Outer.staticMethod(),甚至private static int x -
非法访问:
outerInstance.nonStaticField这类写法在编译期就会报错 -
绕过限制的方式:如需用到实例成员,可手动 new 一个外部类对象,再从中取值,例如
new Outer().instanceField
反射中加载静态内部类
Class.forName 能直接加载,类名用 $ 连接,但注意不是点号:
- 全限定名格式为
com.example.Outer$StaticInner - 调用
Class.forName("com.example.Outer$StaticInner")即可成功获取 Class 对象 - 后续可通过
clazz.getDeclaredConstructor().newInstance()创建实例,仍无需外部类对象
静态内部类中的静态方法调用
和普通静态类一样,调用规则统一:
- 本类静态方法:可直接写方法名,或用
StaticInner.method() - 跨类静态方法:必须写完整类名,如
StringUtils.isEmpty(str) - 禁止使用
this、实例引用或构造器调用,因为静态上下文没有 this
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











