2013-11-23 54 views
0

我有一個問題,我們爲什麼要在內部類中使用它時設置字段最終?例如,爲什麼我們應該將textField的修飾符設置爲final? 我的問題是,如果我們不宣稱它是最終的,爲什麼它不可用?爲什麼我們應該將內部類之外的字段的修飾符改爲final?

final TextField textField = new TextField(); 
    Button b = new Button(); 
    b.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      textField.setText("hello"); 
     } 
    }); 
+0

請參閱Jesper對類似問題的回答 - http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in -a-differen –

+0

看到這個。那麼你可以清除... http://stackoverflow.com/questions/3910324/why-inner-classes-require-final-outer-instance-variables-java – subash

+0

如果你需要改變這些值的可能性,你總是可以使用'持有人'。 – msangel

回答

2

的原因是,從匿名內部類訪問的變量的值複製。如果變量可以從類外部修改,這會產生一個陳舊的(過時的)值,這可能會影響程序的正確性併產生意想不到的結果。 Java通過強制你將這些變量聲明爲final並因此不可修改來避免這個問題。

+0

我不明白爲什麼它會影響程序的正確性?正如你所說的那樣,該字段將被複制,因此我們使用兩個不同的字段,如果我們從內部類或內部類外部更改字段的值,會出現什麼問題? – Siavash

+1

潛在的意圖是從匿名類中訪問變量的值。鑑於匿名類使用該值的副本,如果值隨時間變化,那麼對於同一個變量,可能有兩個不同的值,這是不正確的。 –

相關問題