2012-05-20 98 views
6

方法 - 局部內部類無法訪問局部變量,因爲方法結束後方法局部內部類的實例可能仍然存在。但局部變量一旦本地方法結束就會消失。 我知道方法 - 本地內部類可以訪問最終局部變量,這是否意味着方法結束後,最終局部變量仍然活着?java中最終局部變量的範圍

+3

謹慎發佈您的示例,以免無意誤解您的問題?我們是編碼器,而Java代碼會使這個更清晰。 – jmort253

+0

我認爲這是你的意思,並且_no_它不起作用。 http://ideone.com/LNg9w –

+0

@HunterMcMillen問題是關於方法本地類,而不是其他方法。 – Jeffrey

回答

7

排序Java匿名內部類的行爲就像「閉包」,也就是說,它們在當前本地狀態周圍「關閉」。但是,Java只允許這些類關閉最終變量。如果沒有,變量的本地狀態可能會改變,但內部類中保存的版本不會,因此它將訪問「過期」實例。這可能會讓程序員感到困惑。

相反,Java要求實例通過方法處理可變性,而不是通過變量重新分配。這導致更好的清晰度並允許更簡單的調試。有關Java爲什麼要這樣做的更多信息,請參閱this answer

由於類仍持有該變量的引用,在回答你的問題是,該實例不會被垃圾收集,直到內部類放棄變量的所有權。

+1

*「這可能會讓程序員感到困惑。」* - 更重要的是,它不會再像「封閉」一樣。根據詞彙上下文,您將擁有一個具有明顯不同綁定的標識符名稱。 –

+0

@Stephen公平夠了,好點。 –

1

不,它不。這意味着局部變量的副本在內部類實例中仍然存在。 '最後'只是確保兩份不會混淆價值。