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