為什麼lambda中用到的區域性變數需要為final
區域性變數
區域性變數是儲存在棧上的,而棧上的內容在當前執行緒執行完成之後就會被GC回收掉。
lambda表示式
lambda表示式最終被處理為一個額外的執行緒去執行。絕對不是上面提到的執行緒。如果上面的執行緒執行完了,而這個執行緒又使用到了上面提到的區域性變數會出現錯誤。
為什麼 Lambda 表示式(匿名類) 不能訪問非 final 的區域性變數呢?因為例項變數存在堆中,而區域性變數是在棧上分配,Lambda 表達(匿名類) 會在另一個執行緒中執行。如果線上程中要直接訪問一個區域性變數,可能執行緒執行時該區域性變數已經被銷燬了,而 final 型別的區域性變數在 Lambda 表示式(匿名類) 中其實是區域性變數的一個拷貝。
相關推薦
為什麼lambda中用到的區域性變數需要為final
區域性變數 區域性變數是儲存在棧上的,而棧上的內容在當前執行緒執行完成之後就會被GC回收掉。 lambda表示式 lambda表示式最終被處理為一個額外的執行緒去執行。絕對不是上面提到的執行緒。如果上面的執行緒執行完了,而這個執行緒又使用到了上面提到的區域性變數會出現錯誤
為什麼內部類訪問區域性變數需要加final修飾?
先看一段程式碼: public void myRun(final String name){ new Runnable() { public vo
第三章 (4)擴充套件------lambda表示式與閉包(關於lambda使用區域性變數的補充)
關於閉包,掌握js的童鞋會更加的瞭解,但是如今,我們在學習java8的lambda的時候,上一章提到lambda關於使用區域性變數的時候,書中提到了lambda與閉包的問題。他的原話是這麼說的: 你可能已經聽說過閉
將區域性變數轉化為全域性變數
區域性變數的轉換 將要轉換的區域性變數,在該類的構造器中宣告,並作為引數傳入。 public class ATMThread extends Thread{ //account為區域性變數 private Account account; private double n
匿名類訪問區域性變數時,為什麼區域性變數必須加final
匿名內部類就是在物件的方法體內部定義的類。我們都知道方法中的匿名內部類是能夠訪問同一個方法中的區域性變數的,但是為什麼區域性變數要加上一個final呢? 原因就是因為匿名內部類物件的生命週期可能會超過區域性變數的生命期。區域性變數的生命週期是當該方法被呼叫時,該方法中的區
內部類引用外部類的區域性變數要用final修飾
為什麼內部類引用外部類的區域性變數時,此變數要用final修飾 程式碼 public void test() { final int i = 3; run
Java內部類訪問區域性變數時的final問題
JAVA用了也快三年了,內部類訪問區域性變數的情況也沒少遇到。也一直知道要給變數加個final修飾符,不然通過不了編譯。但一直也沒深究過為什麼要加。昨天好奇的上網查了下,並翻閱了下相關的書籍(Core Java 8th),終於算是搞明白了,在這裡簡單說明下。 說先我們來
區域性內部類引用外部類中的區域性變數必須是final屬性的!
如例中所示,聲明瞭一個區域性內部類TimerPrint,這個類中的方法引用了一個區域性變數testTxt,必須宣告為final!!why? 邏輯上:因為該內部類出現在一個方法的內部,但實際編譯時,內部類編譯為Outer$1TimerPrint.class,這說明,外
匿名內部類訪問方法成員變數需要加final的原因及證明
在java程式設計中,沒用的類定義太多對系統來說也是一個負擔,這時候我們可以通過定義匿名內部類來簡化程式設計,但匿名內部類訪問外部方法的成員變數時都要求外部成員變數新增final修飾符,final修飾
Java8中 區域性內部類訪問的區域性變數不必用final修飾
Java8中,區域性內部類訪問的區域性變數不必用final修飾,這一點和Java7是不一樣的。 下面這段程式碼在Java8中是正確的: public class LocalInnerClassTes
內部類訪問外部類的區域性變數只能是final
public class InnerCalss { private String name = "張三"; @Test public void out(){ String gender = "娜娜";
區域性內部類訪問的區域性變數不必用final修飾,java8中
java8中,區域性內部類訪問的區域性變數不必用final修飾,這一點和Java7是不一樣的。 下面這段程式碼在Java8中是正確的: public class LocalInnerClassTest { public static vo
為什麼區域性變數需要顯式設定初始化值
我們在程式設計中,無時無刻地都在於方法打交道,而在方法中,我們很難不使用區域性變數,比如我們有下
【Java】從內部類中訪問變數,需要宣告為final
Cannot refer to a non-final variable ‘result’ inside an inner class defined in a different method 從內部類中訪問變數’result’,需要宣告為final 這
Java匿名內部類中使用外部類方法的形參或區域性變數必須宣告為final
對於這個問題,首先我們應該明確的一點是對於匿名內部類,它可能引用三種外部變數:外部類的成員變數外部方法或作用域內的區域性變數外部方法的引數而第一種變數是不需要宣告為final的,但後兩種是需要宣告為final的。那這是為什麼呢?不急,我們首先來看第一個知識點。知識點一,匿名內部類同所有類一
java中內部類訪問區域性變數為什麼要定義區域性變數為final
因為方法內定義的變數是區域性變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會離開它所在方法就失去作用,它有更廣的生命週期,下面通過一個例項加以說明: 如例中所示,在外部類Outer中聲明瞭一個內部類TimerPrint,這個類中的方法引用了方法start
為什麼java內部類訪問區域性變數必須宣告為final?
先丟擲讓我疑惑了很久的一個問題 程式設計時,線上程中使用區域性變數時候經常編譯器會提示:區域性變數必須宣告為final package test; publicclass ThreadTest { publicvoid function(Stri
區域性內部類訪問外部變數為什麼需要使用final修飾
因為生命週期的原因。方法中的區域性變數,方法結束後這個變數就要釋放掉,final保證這個變數始終指向一個物件。首先,內部類和外部類其實是處於同一個級別,內部類不會因為定義在方法中就會隨著方法的執行完畢而跟隨者被銷燬。問題就來了,如果外部類的方法中的變數不定義final,那麼
Java8中內部類不再需要明確定義外部類變數為final
public class OutClass { public void outFunc() { // java8以前的寫法 // final String outFuncVar = "outFuncVar"; // java8以後可以這樣寫 String outFuncVa
第三章(3) lambda表示式型別檢查、型別推斷以及區域性變數
1.型別檢查 當我們在之前第一次提到lambda表示式的時候,說它可以為函式式介面生成一個例項。然而,Lambda表示式本身並不包含它在實現哪個函式式介面的資訊。為了全面瞭解Lambda表示式,你