首先,看以下代码:

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相关推荐

  1. java增加final,Java8增加功能--Effectively final 功能

    java8新增了很多功能,可以大大简化代码,这个系列将会一一辅助代码加以介绍. 局部内部类和匿名内部类访问的局部变量必须由final修饰,java8开始,可以不加final修饰符,由系统默认添加.ja ...

  2. java中的final关键字和effectively final

    我们在给lamda传参数时,可能会出现如下情况: Variable used in lambda expression should be final or effectively final 一般情 ...

  3. java 8新特性之effectively final

    我们平时使用内部类时,如果需要使用外部的变量,只能通过final关键字来修饰该变量,在java8中,有了新的处理方式,如下: 针对于jdk1.8,对于一个变量,如果没有给它加final修饰,而且没有对 ...

  4. 1.20 Java8新特性:Effectively final

    Java 中局部内部类和匿名内部类访问的局部变量必须由 final 修饰,以保证内部类和外部类的数据一致性.但从 Java 8 开始,我们可以不加 final 修饰符,由系统默认添加,当然这在 Jav ...

  5. Java8新特性:等同 final 效果(Effectively Final)

    闭包 Effectively Final 示例 闭包 闭包就是能够读取函数作用域之外的变量的函数. 考虑一个返回复杂的 lambda 的高阶函数,使用了函数作用域之外的变量,返回该函数会发生什么? j ...

  6. 浅谈Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  7. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  8. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  9. 深入理解Java中的final关键字

    深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...

  10. 在Java中使用final关键字可以提高性能吗?

    本文翻译自:Does use of final keyword in Java improve the performance? In Java we see lots of places where ...

最新文章

  1. 免费 | 程序员如何在面试中避免被坑?今晚告诉你!
  2. centos 安装 erlang
  3. 分不清的InputStream和OutputStream
  4. java读取文件 16进制_Java对文件的16进制读取和操作
  5. 农村民间借贷一分利息,有借条受法律保护吗?
  6. 405: HTTP method GET is not supported by this URL
  7. android资源透明背景,@谷歌android帝 这是你想要的,全局透明背景教程,两种方法...
  8. DPDK l2fwd收发包思维导图
  9. 腾讯广告算法大赛 | 第一周周冠军心得分享
  10. 翻译: 4.3. 多层感知器的简明实现MLP pytorch
  11. web页面视频播放器选型
  12. 如何修改电脑的ip地址
  13. 忧伤,捧一把尘埃将自己埋葬
  14. 乱得那么认真|阿里小二办公桌上的秘密~内部流出
  15. Python--进程池与线程池
  16. ajax里数组添加数据,小笔记(一):ajax传递数组及将ajax返回数据赋值
  17. vue中image 的:src 与 src
  18. 如何把一组计算机做成云,怎样才能把旧电脑变成云电脑呢?
  19. 解决Centos7关闭You have new mail in /var/spool/mail/root提示
  20. C++ 命名空间,也有叫名称空间

热门文章

  1. 三峡大学校赛----十万桃花图(线性基)
  2. base scroll横向滚动_微信小程序实践:2.3 可滚动的容器组件之 scroll-view
  3. WebStream生成vue项目报错Error: The project seems to require yarn but it‘s not installed.
  4. 笔记(待续)-基于梯度下降法的RBF神经网络控制
  5. arcgis 空间交集 计算_基于ArcGIS的GIS缓冲区与叠加分析的综合应用——以大型商场选址为例...
  6. String 源码浅析————终结篇
  7. Docker搭建ElasticSearch
  8. html代码word,Web前端
  9. Vulkan学习(三):小结
  10. 以下关于python缩进的描述_以下关于Python缩进的描述中,错误的是