java8(二)Lambda 使用局部变量为什么要显示声明为final 或者 事实上分final

int  i=1;
Runnable r=()->System.out.println(i);

先来说下什么是事实上的final。 如果我声明了一个变量,且在后面不更改它的值,那么那就是事实上的final。

我改下代码

int  i=1;
Runnable r=()->System.out.println(i);
i=2;

如果i是局部变量,那么会编译出错。为什么

我们知道,实例变量是储存在堆上面的,是线程贡献的。而局部变量则是保存在栈上的,是线程不共享的。

Lambda是在一个线程当总使用的。java访问局部变量的时候,实际上是去访问他的副本。如果局部变量改变了,那访问的也是之前的值。

所以java8就有了这个限制。

发布了82 篇原创文章 · 获赞 49 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/xu505928168/article/details/97928052