匿名內部類訪問final局部變量


舉一個最簡單的例子,拿Andorid開發來講,我們在一個函數中new了一個progressbar,然后我們給一個按鈕設置了OnClickListener,希望點擊了這個按鈕之后,進度條消失。自然而然的,最簡單的方法,就是我們將progressbar設置為外部類的成員,這樣內部類和這個成員的生命周期就一致了,訪問當然也沒有問題。但是,如果不允許添加新的成員呢?

這個時候,通過設置該progressbar為final就可以解決問題了。這是為什么呢?

我們都知道,在java中,全局變量,final變量和static變量,都是存儲在heap中的;而局部變量則是存儲在frame中的,函數調用的過程中,用ebp來指向棧底,而用esp來指向正在執行處。

而且函數內部調用其他函數的時候,會壓棧,push ebp,生成新的frame。要把上一個frame中的局部變量傳遞給下一個frame,一般是使用相對位置來表示的,比如ebp-4等。

但是外部類中的局部變量和內部類對象的生命周期是不一致的,這個時候,如果跨frame,那么內部類中的frame就找不到外部類中的局部變量的位置。

所以,就有了final機制。

這是一種copy local variable的設計。final類型的局部變量在被匿名內部類訪問的時候,會自動被拷貝,該拷貝會變為內部類的成員,從而造成了一種局部變量生命周期延長的假象。

最后需要說明一點的是,匿名內部類只能使用一次哦。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com