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就有了這個限制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章