1. 程式人生 > >區域性變數被內部類訪問時必須用final修飾的問題

區域性變數被內部類訪問時必須用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,即可防止混亂的產生。