事實上,除了匿名內部類內部,方法和作用域內的內部類內部使用的外部變數也必須是 final 的。原因大致總結一下:
簡單解釋就是:方法中的區域變數的生命周期很短,方法結束后變數就要被銷毀,加上final是為了延長變數的生命周期。
進一步解釋: 內部類通常都含有回呼,參考那個匿名內部類的函式執行完了就沒了,所以內部類中參考外面的區域變數需要是final的,這樣在回呼的時候才能找到那個變數,而如果是外圍類的成員變數就不需要是final的,因為內部類本身都會含有一個外圍了的參考(外圍類.this),所以回呼的時候一定可以訪問到。
程式示例:
private Animator createAnimatorView(final View view, final int position) {
MyAnimator animator = new MyAnimator();
animator.addListener(new AnimatorListener() {
@Override
public void onAnimationEnd(Animator arg0) {
Log.d(TAG, "position=" + position); } });
return animator;
}
匿名內部類回呼里訪問position的時候createAnimatorView()早就執行完了,position如果不是final的,回呼的時候肯定就無法獲取它的值了,因為區域變數在函式執行完了以后就被回收了。所以java干脆把這樣的變數設計成final,一旦初始化,就必須不能改變!這樣保證任何時候進行回呼都能得到所需的值。
原文鏈接:https://blog.csdn.net/yangyong0717/article/details/78635828
uj5u.com熱心網友回復:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87422.html
標籤:Eclipse
上一篇:關于安裝
下一篇:Java表單顯示圖片
