变量捕获相关内容

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

相关推荐
灰色人生qwer几秒前
解决IDEA运行Java程序jdk版本不匹配问题
java·开发语言·intellij-idea
小侯不躺平.2 分钟前
C++ Boost库【3】 --类型推导
开发语言·c++
枫叶丹42 分钟前
【HarmonyOS 6.0】状态栏扩展新特性:点击状态栏图标展开二级菜单的场景动效详解
开发语言·华为·harmonyos
yaoxin5211234 分钟前
405. Java 文件操作基础 - 装饰者模式与 I/O Streams
java·开发语言·python
xiufeia5 分钟前
后端项目初始化的一些小坑点
java·junit·maven·idea
丑八怪大丑6 分钟前
JDBC基础篇
java·sql
Unbelievabletobe8 分钟前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
wang3zc9 分钟前
CSS如何实现元素镜像翻转_使用transformscalex负值
jvm·数据库·python
CLX050514 分钟前
Golang如何做图片处理缩放_Golang图片处理教程【收藏】
jvm·数据库·python
2301_8125396720 分钟前
mysql如何限制用户连接数_使用MAX_USER_CONNECTIONS优化并发
jvm·数据库·python