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