变量捕获相关内容
变量捕获是匿名内部类和 Lambda 表达式中的一个重要概念,指的是内部代码块访问外部作用域中变量的机制。
1.变量捕获的原理:
为什么需要 final
生命周期问题:
- 局部变量在方法执行结束后就销毁了
- 但匿名内部类对象可能还在运行(比如在另外一个线程中)
- 为了保证内部类能正常访问已经销毁的变量,Java 采用值拷贝方式
public void understandWhyFinal() {int count = 0; // 栈上的局部变量Runnable task = new Runnable() {private int capturedCount = count; // 🔥 Java 在背后做的:值拷贝@Overridepublic void run() {System.out.println(capturedCount); // 访问的是拷贝的值}};count = 100; // 修改原变量// 但 task 中捕获的仍然是 0(拷贝时的值)new Thread(task).start(); // 输出: 0
}如果允许修改会产生数据不一致的问题,所有 Java 强制要求 final
