今天學習中遇到了一個問題:
Cannot refer to the non-final local variable list defined in an enclosing scope
這里的new Runnable(){...}是一個匿名局部內部類,其訪問test()方法的局部變量list就會發生編譯錯誤
解決方法:
用final修飾list
原因:
程序執行test()方法時,在方法的調用棧中生成了局部變量變量list,此時產生了一個局部內部類對象,它訪問了該局部變量list,當方法test()運行結束后,局部變量list就已死亡了,不存在了,但:局部內部類對象還可能一直存在(只能沒有人再引用該對象時,它才會死亡),它不會隨着方法test()運行結束死亡。局部內部類對象和局部變量list的生命周期不一致,局部變量list死后,局部內部類對象不能訪問一個不存在的變量。
使用final修飾符修飾局部變量list,這時的局部內部類對象將list的“復制品”作為自己的數據成員,當局部變量list死亡以后局部內部類對象依然可以訪問list的“復制品”。
注意:Java8中不寫final也能通過編譯(會隱式的添加final)
(我的是Java7)