今天隨手寫了點東西,又遇到了這個問題,就是在當內部類想要訪問局部變量的時候 ,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,即可防止混亂的產生。