2013-11-23 39 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

潜在的意图是从匿名类中访问变量的值。鉴于匿名类使用该值的副本,如果值随时间变化,那么对于同一个变量,可能有两个不同的值,这是不正确的。 –

相关问题