之前寫過一個項目,好久沒更新了,最近翻起以前的代碼,發現在這里報了一個錯。(現在轉到Intellij了,從前在Eclipse luna中是可以編譯通過的,Eclipse mars也會報錯,JDK版本都是1.8,還沒去查為什么)
為什么在內部類中引用外部變量時,必須聲明為final呢?
最開始我想的是,會和Java的內存模型有關。因為我們都知道,帶有static的變量或者方法是屬於類的,也就是說,類成員是被儲存在堆內存里面的。那么final是否也是這樣?經過查找資料,得知:final 是保護 所修飾的類、方法、變量不能被改變的,並不占用內存。因此,並不是因為內存的關系。
真正的原因是因為生命周期的原因。方法中的局部變量,方法結束后這個變量就要釋放掉,而final會保證這個變量始終指向一個對象。
首先,內部類和外部類其實是處於同一個級別,內部類不會因為定義在方法中就會隨着方法的執行完畢而跟隨者被銷毀。問題就來了,如果外部類的方法中的變量不定義final,那么當外部類方法執行完畢的時候,這個局部變量肯定也就被GC了,然而內部類的某個方法還沒有執行完,這個時候他所引用的外部變量已經找不到了。如果定義為final,java會將這個變量復制一份作為成員變量內置於內部類中,這樣的話,由於final所修飾的值始終無法改變,所以這個變量所指向的內存區域就不會變。
