1. 程式人生 > >Cannot refer to a non-final variable xx inside an inner class defined in a different method的原因

Cannot refer to a non-final variable xx inside an inner class defined in a different method的原因

今天遇到一個小問題,下面是網上摘抄的解釋:

為了說明這個問題,先得明白說明是區域性內部類,區域性內部類就是在外部類的方法中定義的類。那麼標題中的錯誤指的是,內部類不能引用該方法中非 final 修飾的變數。

那麼為什麼呢?

因為生命週期的原因。方法中的區域性變數,方法結束後這個變數就要釋放掉,final保證這個變數始終指向一個物件。

首先,內部類和外部類其實是處於同一個級別,內部類不會因為定義在方法中就會隨著方法的執行完畢而跟隨者被銷燬。問題就來了,如果外部類的方法中的變數不定義final,那麼當外部類方法執行完畢的時候,這個區域性變數肯定也就被GC了,然而內部類的某個方法還沒有執行完,這個時候他所引用的外部變數已經找不到了。如果定義為final,java會將這個變數複製一份作為成員變數內置於內部類中,這樣的話,由於final所修飾的值始終無法改變,所以這個變數所指向的記憶體區域就不會變。