匿名內部類訪問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型別的區域性變數在被匿名內部類訪問的時候,會自動被拷貝,該拷貝會變為內部類的成員,從而造成了一種區域性變數生命週期延長的假象。
最後需要說明一點的是,匿名內部類只能使用一次哦。
相關文章
- java內部類,區域性內部類,靜態內部類,匿名內部類Java
- Java之區域性匿名內部類物件Java物件
- 10-Java內部類——成員內部類、區域性內部類、匿名內部類Java
- java之內部類(InnerClass)----非靜態內部類、靜態內部類、區域性內部類、匿名內部類Java
- 區域性內部類
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- Java內部類詳解--區域性內部類Java
- java內部類之成員內部類之區域性內部類Java
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- [短文速讀-3] 內部匿名類使用外部變數為什麼要加final變數
- java為什麼匿名內部類的引數引用時final?Java
- 匿名內部類
- Java內部類詳解--匿名內部類Java
- 匿名內部類理解
- java內部類之成員內部類之匿名內部類Java
- Java內部類和匿名內部類的用法Java
- Java類與匿名內部類Java
- Python中類變數、成員變數、區域性變數的區別Python變數
- 匿名內部類泛型泛型
- 全域性變數與區域性變數變數
- 區域性變數和全域性變數變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- Python3通過字串訪問與修改區域性變數Python字串變數
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 【c】全域性變數與區域性變數變數
- java培訓教程:什麼是匿名內部類?怎樣建立匿名內部類?Java
- Java基礎10---包、內部類、匿名內部類Java
- C#特性-匿名型別與隱式型別區域性變數C#型別變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- Java訪問類變數Java變數
- python全域性變數與區域性變數Python變數
- Java中的匿名內部類及內部類的二三事Java
- Python閉包區域性變數問題Python變數
- 成員變數和區域性變數變數