Java 为什么我们要将内部类外部字段的修饰符更改为final?

Java 为什么我们要将内部类外部字段的修饰符更改为final?,java,final,anonymous-inner-class,Java,Final,Anonymous Inner Class,我有一个问题,当我们在内部类中使用字段final时,为什么要设置它? 例如,为什么要将textField的修饰符设置为final? 我的问题是,如果我们不宣布它为最终版本,为什么它将不可用 final TextField textField = new TextField(); Button b = new Button(); b.addMouseListener(new MouseAdapter() { @Override public vo

我有一个问题,当我们在内部类中使用字段final时,为什么要设置它? 例如,为什么要将textField的修饰符设置为final? 我的问题是,如果我们不宣布它为最终版本,为什么它将不可用

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

原因是从匿名类中访问的变量值被复制。如果可以从类外部修改变量,则会产生过时的值,这可能会影响程序的正确性并产生意外的结果。Java通过强制您将这些变量声明为final,从而不可修改,从而避免了这个问题。

请参阅Jesper对类似问题的回答-参见此。然后你可以清除。。。如果您需要更改这些值,您可以始终使用
Holder
。我不明白为什么它会影响程序的正确性?正如您所说的,字段将被复制,因此我们使用两个不同的字段。如果我们从内部类外部或从内部类更改字段的值,会出现什么问题?基本意图是从匿名类内部访问变量的值。假设匿名类使用值的副本,如果值随时间变化,那么对于同一变量,可能会有两个不同的值,这是不正确的。