- 這里所說的“匿名內(nèi)部類”主要是指在其外部類的成員方法內(nèi)定義,同時完成實例化的類,若其訪問該成員方法中的局部變量,局部變量必須要被final修飾。
- 原因是編譯程序實現(xiàn)上的困難:內(nèi)部類對象的生命周期會超過局部變量的生命周期。局部變量的生命周期:當該方法被調用時,該方法中的局部變量在棧中被創(chuàng)建,當方法調用結束時,退棧,這些局部變量全部死亡。而內(nèi)部類對象生命周期與其它類一樣:自創(chuàng)建一個匿名內(nèi)部類對象,系統(tǒng)為該對象分配內(nèi)存,直到?jīng)]有引用變量指向分配給該對象的內(nèi)存,它才會死亡(被JVM垃圾回收)。所以完全可能出現(xiàn)的一種情況是:成員方法已調用結束,局部變量已死亡,但匿名內(nèi)部類的對象仍然活著。
- 如果匿名內(nèi)部類的對象訪問了同一個方法中的局部變量,就要求只要匿名內(nèi)部類對象還活著,那么棧中的那些它要所訪問的局部變量就不能“死亡”。
- 解決方法:匿名內(nèi)部類對象可以訪問同一個方法中被定義為final類型的局部變量。定義為final后,編譯程序的實現(xiàn)方法:對于匿名內(nèi)部類對象要訪問的所有final類型局部變量,都拷貝成為該對象中的一個數(shù)據(jù)成員。這樣,即使棧中局部變量已死亡,但被定義為final類型的局部變量的值永遠不變,因而匿名內(nèi)部類對象在局部變量死亡后,照樣可以訪問final類型的局部變量,因為它自己拷貝了一份,且與原局部變量的值始終一致。
簡而言之:局部變量的生命周期與局部內(nèi)部類的對象的生命周期的不一致性!
匿名內(nèi)部類不能訪問外部類方法中的局部變量,除非變量被聲明為final類型
最后編輯于 :
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內(nèi)容
- 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...