变量应该是最终的内部监听器

GET*_*Tah 2 java

可能重复:
不能引用在不同方法中定义的内部类中的非final变量
为什么在匿名类中只能访问最终变量?

在SO和谷歌寻找这个问题的答案,但找不到任何答案.

我有以下代码:

MyClass variable = new MyClass();
Button b = new Button();
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
         System.out.println("You clicked the button");
         variable.doSomething();
   }
});
Run Code Online (Sandbox Code Playgroud)

编译器返回:

从内部类中访问局部变量变量; 需要宣布最终

什么variable必须是最终的技术原因是什么?

Ale*_*exR 6

这是因为你使用的是匿名内部类.会发生什么是编译器为您创建类.它要求它作为你的外部类,并添加$和数量,例如$,$2等等.

该类引用了自动初始化的外部类,因此它的实例可以使用外部类的方法和字段.

但你的班级是匿名的.这里面那种方法的定义,并且可以使用这个匿名类之前定义的内部变量.问题是"它怎么能这样做?" 实际上,您不能引用"运行方法的实例"来访问其变量.答案是从匿名内部类引用的所有方法变量都被复制到匿名内部类.因此,变量必须是最终的:否则有人可以从外部类中更改它们的值,并且更改将不会在内部类中可见.