变量捕获相关内容

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

相关推荐
拉不动的猪2 小时前
Token无感刷新全流程(Vue + Axios + Node.js(Express))
java·javascript·vue.js
百锦再2 小时前
大型省级政务平台采用金仓数据库(KingbaseES)
开发语言·数据库·后端·rust·eclipse
m0_639817152 小时前
基于springboot个人云盘管理系统【带源码和文档】
java·spring boot·后端
biter down2 小时前
C 语言17:位操作符 & | ^:从二进制编码到大小端
c语言·开发语言
大头an2 小时前
Spring事务隔离级别全解析:从读未提交到序列化
java
mjhcsp2 小时前
C++ map 容器:有序关联容器的深度解析与实战
开发语言·c++·map
将编程培养成爱好2 小时前
C++ 设计模式《账本事故:当备份被删光那天》
开发语言·c++·设计模式·备忘录模式
黑咩狗夜.cm2 小时前
Aspose.word实现表格每页固定表头、最后一行填满整个页面
开发语言·c#·word
大隐隐于野3 小时前
从零开始理解和编写LLM中的KV缓存
java·缓存·llm