以前寫過一個項目,很久沒更新了,最近翻起之前的代碼,發如今這裏報了一個錯。(如今轉到Intellij了,從前在Eclipse luna中是能夠編譯經過的,Eclipse mars也會報錯,JDK版本都是1.8,還沒去查爲何)java
爲何在內部類中引用外部變量時,必須聲明爲final呢?對象
最開始我想的是,會和Java的內存模型有關。由於咱們都知道,帶有static的變量或者方法是屬於類的,也就是說,類成員是被儲存在堆內存裏面的。那麼final是否也是這樣?通過查找資料,得知:final 是保護 所修飾的類、方法、變量不能被改變的,並不佔用內存。所以,並非由於內存的關係。生命週期
真正的緣由是由於生命週期的緣由。方法中的局部變量,方法結束後這個變量就要釋放掉,而final會保證這個變量始終指向一個對象。ip
首先,內部類和外部類實際上是處於同一個級別,內部類不會由於定義在方法中就會隨着方法的執行完畢而跟隨者被銷燬。問題就來了,若是外部類的方法中的變量不定義final,那麼當外部類方法執行完畢的時候,這個局部變量確定也就被GC了,然而內部類的某個方法尚未執行完,這個時候他所引用的外部變量已經找不到了。若是定義爲final,java會將這個變量複製一份做爲成員變量內置於內部類中,這樣的話,因爲final所修飾的值始終沒法改變,因此這個變量所指向的內存區域就不會變。內存