1. 程式人生 > >匿名內部類訪問外部類方法中的區域性變數

匿名內部類訪問外部類方法中的區域性變數

        匿名內部類不能訪問外部類方法中的區域性變數,除非變數被宣告為final型別

  1. 這裡所說的“匿名內部類”主要是指在其外部類的成員方法內定義,同時完成例項化的類,若其訪問該成員方法中的區域性變數,區域性變數必須要被final修飾。
  2. 原因是編譯程式實現上的困難:內部類物件的生命週期會超過區域性變數的生命週期。區域性變數的生命週期:當該方法被呼叫時,該方法中的區域性變數在棧中被建立,當方法呼叫結束時,退棧,這些區域性變數全部死亡。而內部類物件生命週期與其它類一樣:自建立一個匿名內部類物件,系統為該物件分配記憶體,直到沒有引用變數指向分配給該物件的記憶體,它才會死亡(被JVM垃圾回收)。所以完全可能出現的一種情況是:成員方法已呼叫結束,區域性變數已死亡,但匿名內部類的物件仍然活著。
  3. 如果匿名內部類的物件訪問了同一個方法中的區域性變數,就要求只要匿名內部類物件還活著,那麼棧中的那些它要所訪問的區域性變數就不能“死亡”。
  4. 解決方法:匿名內部類物件可以訪問同一個方法中被定義為final型別的區域性變數

。定義為final後,編譯程式的實現方法:對於匿名內部類物件要訪問的所有final型別區域性變數,都拷貝成為該物件中的一個數據成員。這樣,即使棧中區域性變數已死亡,但被定義為final型別的區域性變數的值永遠不變,因而匿名內部類物件在區域性變數死亡後,照樣可以訪問final型別的區域性變數,因為它自己拷貝了一份,且與原區域性變數的值始終一致。