变量捕获相关内容

变量捕获是匿名内部类和 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

相关推荐
郝学胜-神的一滴4 分钟前
深度拆解Python迭代协议:从底层原理到核心实践,解锁异步编程的基石
java·网络·python
码云数智-大飞4 分钟前
前端性能优化实战:如何大幅减少应用加载时间?
java
Memory_荒年4 分钟前
SpringBoot 3.x 新特性:让代码自己“996”,你准时下班!
java·后端·spring
Yang-Never5 分钟前
AI Code -> Windows电脑安装Claude
开发语言·windows·git
天下无敌笨笨熊11 分钟前
C#异步开发探微
开发语言·c#
2401_8331977311 分钟前
更优雅的测试:Pytest框架入门
jvm·数据库·python
后端AI实验室12 分钟前
等保三级整改,敏感数据加密,数十个系统——3个人用Cursor一周搞定了
java·ai
qq_3340602113 分钟前
spring_springmvc_mybatis权限控制+boostrap实现UI
java·spring·mybatis
2301_7938046914 分钟前
C++中的访问者模式变体
开发语言·c++·算法
2501_9454248018 分钟前
模板代码版本兼容
开发语言·c++·算法