Java 8 effectively final
首先,看以下代码:
public static void main(String[] args) {int a = 1;int b = 2;b = 3;Runnable runnable = ()->{System.out.println(a);System.out.println(b); //此行报错。};
}
其中 pintln(b) 那行报错,报错信息如下:
Variable used in lambda expression should be final or effectively final
意思就是说在 lambda 表达式中使用的变量应为 final 或 effectively final。
之所以报这个错是因为Java规定:内部类或lambda表达式中使用的外部的局部变量,必须由final修饰。
那么println(a)那行为什么没有报错呢,这是因为Java8的新特性:effectively final(事实final),即未被改变过值的变量将被认定为事实上的final变量,而无需显性的用final进行修饰。
思考: 为什么Java要规定内部类或lambda表达式中使用的外部局部变量必须由final修饰。
因为Java中的局部变量是储存在栈中的,一旦方法执行完毕,局部变量就会被释放。那么,假如我们使用匿名内部类的方式或lambda表达式的方式创建了一个线程,并且在run方法中使用了外部方法的局部变量,这就可能造成外部方法已经执行完毕,局部变量已经释放,而线程却还在执行,还需要引用外部方法的局部变量。
所以,实际上内部类或lambda表达式中并不是直接引用外部方法的局部变量,而是复制了一个副本。
这种情况下,如果不加final修饰的限制的话,就可能造成,外部方法在后续的代码中已经改变了该局部变量的值,而内部类中使用的却还是原先值的副本,这在逻辑上显然是比较混乱的。
Java 8 effectively final相关推荐
- java增加final,Java8增加功能--Effectively final 功能
java8新增了很多功能,可以大大简化代码,这个系列将会一一辅助代码加以介绍. 局部内部类和匿名内部类访问的局部变量必须由final修饰,java8开始,可以不加final修饰符,由系统默认添加.ja ...
- java中的final关键字和effectively final
我们在给lamda传参数时,可能会出现如下情况: Variable used in lambda expression should be final or effectively final 一般情 ...
- java 8新特性之effectively final
我们平时使用内部类时,如果需要使用外部的变量,只能通过final关键字来修饰该变量,在java8中,有了新的处理方式,如下: 针对于jdk1.8,对于一个变量,如果没有给它加final修饰,而且没有对 ...
- 1.20 Java8新特性:Effectively final
Java 中局部内部类和匿名内部类访问的局部变量必须由 final 修饰,以保证内部类和外部类的数据一致性.但从 Java 8 开始,我们可以不加 final 修饰符,由系统默认添加,当然这在 Jav ...
- Java8新特性:等同 final 效果(Effectively Final)
闭包 Effectively Final 示例 闭包 闭包就是能够读取函数作用域之外的变量的函数. 考虑一个返回复杂的 lambda 的高阶函数,使用了函数作用域之外的变量,返回该函数会发生什么? j ...
- 浅谈Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
- 深入理解Java中的final关键字
深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...
- 在Java中使用final关键字可以提高性能吗?
本文翻译自:Does use of final keyword in Java improve the performance? In Java we see lots of places where ...
最新文章
- 免费 | 程序员如何在面试中避免被坑?今晚告诉你!
- centos 安装 erlang
- 分不清的InputStream和OutputStream
- java读取文件 16进制_Java对文件的16进制读取和操作
- 农村民间借贷一分利息,有借条受法律保护吗?
- 405: HTTP method GET is not supported by this URL
- android资源透明背景,@谷歌android帝 这是你想要的,全局透明背景教程,两种方法...
- DPDK l2fwd收发包思维导图
- 腾讯广告算法大赛 | 第一周周冠军心得分享
- 翻译: 4.3. 多层感知器的简明实现MLP pytorch
- web页面视频播放器选型
- 如何修改电脑的ip地址
- 忧伤,捧一把尘埃将自己埋葬
- 乱得那么认真|阿里小二办公桌上的秘密~内部流出
- Python--进程池与线程池
- ajax里数组添加数据,小笔记(一):ajax传递数组及将ajax返回数据赋值
- vue中image 的:src 与 src
- 如何把一组计算机做成云,怎样才能把旧电脑变成云电脑呢?
- 解决Centos7关闭You have new mail in /var/spool/mail/root提示
- C++ 命名空间,也有叫名称空间
热门文章
- 三峡大学校赛----十万桃花图(线性基)
- base scroll横向滚动_微信小程序实践:2.3 可滚动的容器组件之 scroll-view
- WebStream生成vue项目报错Error: The project seems to require yarn but it‘s not installed.
- 笔记(待续)-基于梯度下降法的RBF神经网络控制
- arcgis 空间交集 计算_基于ArcGIS的GIS缓冲区与叠加分析的综合应用——以大型商场选址为例...
- String 源码浅析————终结篇
- Docker搭建ElasticSearch
- html代码word,Web前端
- Vulkan学习(三):小结
- 以下关于python缩进的描述_以下关于Python缩进的描述中,错误的是