局部内部类是定义在方法体内的类,无访问修饰符,作用域限于该方法,可访问外部类所有成员,但只能访问final或事实上final的局部变量,且仅能在声明它的方法内实例化。

在 Java 中,把一个类直接写在外部类的某个方法内部,它就是局部内部类。这种写法不需要额外修饰符,也不对外暴露,只属于那个方法自己的“私有工具”。
声明位置必须在方法体内部
局部内部类只能出现在方法的大括号 {} 里,不能在方法签名、注释或方法外的任何地方。它和局部变量地位相同,作用域仅限于当前方法执行期间。
- ✅ 正确:写在
public void doSomething() { ... }的花括号内 - ❌ 错误:写在方法签名后、花括号外;或写在类的字段区、构造器外;或写在 if/for 块之外但仍在方法内(需确保在有效作用域内)
语法上不能加任何访问修饰符
它不是类成员,而是方法内的“临时类”,所以 public、private、protected、static 都不允许出现。加上就会编译报错。
- ❌
private class Helper { ... }→ 编译失败 - ❌
static class Cache { ... }→ 局部内部类天然不支持 static(除 static final 常量) - ✅
class Helper { ... }→ 唯一合法写法
能访问外部类所有成员,但访问局部变量有限制
它可以自由调用外部类的 public、protected、default、private 字段和方法;访问所在方法的局部变量时,该变量必须是 final 或“事实上 final”(Java 8+ 允许不显式写 final,但值不能变)。
- 例如:方法中定义
int x = 10;,之后没再赋值 → 局部内部类可安全使用 x - 若后续写了
x = 20;→ 编译报错:“local variables referenced from an inner class must be final or effectively final”
实例化只能在声明它的方法里进行
它没有生成独立的公开类名(编译后是类似 Outer$1.class 的编号文件),因此无法在方法外 new,也不能被其他类引用或继承。
- ✅ 方法内:
Helper h = new Helper(); h.run(); - ❌ 方法外:
new Outer().new Helper();或new Helper();→ 编译错误 “Cannot resolve symbol 'Helper'”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











