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