局部變量被內部類訪問時必須用final修飾的問題

今天隨手寫了點東西,又遇到了這個問題,就是在當內部類想要訪問局部變量的時候 ,Java就要求該局部變量必須用final關鍵字進行修飾。之前寫程序的時候經常遇到這樣的問題,當時只是奔着快點結局問題的目的也沒仔細的思考它本質的原因。

但是我想Java如此的設計肯定有其目的,於是便靜下心來想了一下。

先貼一個實例。

/*
 * final修飾局部變量的問題測試
 * 
 */
public class FinalTest extends JFrame{
JButton testBtn=new JButton();
public FinalTest() {
int a=1;//這裏定義了一個局部變量

testBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
a=3;//匿名內部類嘗試去訪問a這個局部變量
}
});
}
}

此時IDE會提示報錯,Cannot refer to a non-final variable a inside an inner class defined in a different method

即提示你將局部變量修改爲final即可。


下面我們就來思考一下,Java設計這種機制的原因所在。

首先,a作爲一個局部變量,其生命週期應該在該方法運行結束後就完結,但是在此處被內部類所引用,會導致其作用域的擴大。如果在此期間又對局部變量的值隨意改變,將會造成混亂。因此要將該局部變量的屬性硬性的修改爲final,即可防止混亂的產生。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章