Variable used in lambda expression should be final or effectively final

Variable used in lambda expression should be final or effectively final

使用lamada表达式创建新线程,当用局部变量时老是出现这个红线

大致意思是:lambda表达式中使用的变量应该是final或者有效的final

Java Jdk8.0 之后,在匿名类或 Lambda 表达式中访问的局部变量,如果不是 final 类型的话,编译器自动加上 final 修饰符。那为什么会错呢?看自己的代码,你重新赋值了!!!

lambda 表达式或者匿名内部类创建新线程为什么不能访问非 final 的局部变量呢

因为实例变量存在堆中,而局部变量是在栈上分配。如果在新创建的线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式中其实是局部变量的一个拷贝。

因为我是学习测试的! 我用的全局变量,因为全局变量存在于方法区!线程共享! 先到这,以后学到其他方法再写!

 

 

final拓展:

1.修饰类:当用final修饰一个类时,表明这个类不能被继承(修饰类时类中的所有的方法会隐式的指定final方法)。

2.修饰方法:禁止该方法在子类中被重写!

3.修饰变量:如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

 

 

参考大佬文章:https://blog.csdn.net/qq_36221788/article/details/100584500

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值