區域性變數被內部類訪問時必須用final修飾的問題
阿新 • • 發佈:2019-01-09
今天隨手寫了點東西,又遇到了這個問題,就是在當內部類想要訪問區域性變數的時候 ,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,即可防止混亂的產生。