局部内部类必须定义在方法体内,作用域限于该方法,不能加访问修饰符;可访问外部类所有成员,但只能访问“事实上final”的局部变量;仅能在定义方法内实例化,典型用于事件监听等强耦合闭包场景。

局部内部类必须定义在方法体(或代码块)内,作用域严格限定在该方法中,不能被外部访问,也不能加任何访问修饰符。
定义时的关键限制
局部内部类不是成员,地位等同于局部变量,因此有几条硬性规则:
- 不能用 public、private、protected 或 static 修饰——编译直接报错
- 可以加 final 或 abstract(但 abstract 类需被继承或实现,实际较少用)
- 类名必须合法,且不能与所在方法内的其他标识符重名
- 定义位置必须在方法体内部,不能在方法签名后、大括号外
访问外部变量的注意事项
它能访问外部类的所有成员(包括 private),但访问所在方法的局部变量或参数时,有明确约束:
- Java 8 及以后允许访问“事实上 final”的变量——即声明后未被重新赋值,无需显式写 final
- 如果变量后续被修改,又在内部类中引用,编译会拒绝
- 引用类型变量(如 List、StringBuffer)被捕获的是对象地址,内部类持有的是同一份引用;修改对象内容(如 list.add())会影响外部,但重新赋值(如 list = new ArrayList())则不被允许
在方法内实例化与调用
只能在定义它的方法体内创建实例,方式和其他类一致:
立即学习“Java免费学习笔记(深入)”;
- 直接使用 new 类名(),例如
new Task().run(); - 可多次 new,也可赋值给局部变量再调用
- 不能在方法 return 后、或 try/catch 之外的作用域里使用
- 若需返回行为,通常通过接口或父类向上转型(利用多态),否则无法传出方法
典型适用场景
适合封装一段与当前方法强耦合、需闭包语义的逻辑:
- 事件监听器(如 Swing 中的按钮点击处理)
- 延迟初始化中的临时策略类
- 需要复用多个方法内变量,又比匿名内部类更复杂(比如含多个方法、构造逻辑或字段)
- 避免将简单逻辑暴露为成员类,保持类结构简洁


















