java - 变量应该在监听器中是最终的

标签 java

<分区>

Possible Duplicate:
Cannot refer to a non-final variable inside an inner class defined in a different method
Why are only final variables accessible in anonymous class?

在 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();
   }
});

编译器返回:

local variable variable is accessed from within inner class; needs to be declared final

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

最佳答案

这是因为你使用的是匿名内部类。 发生的事情是编译器为你创建类。它称它为你的外部类并添加 $ 和数字,例如$, $2

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

但是你的类(class)是匿名的。它是在方法内部定义的,并且可以使用在此匿名类之前定义的 内部变量。问题是“它怎么做到的?”真的,你不能引用“运行方法的实例”来访问它的变量。答案是匿名内部类引用的所有方法变量都被复制到匿名内部类中。因此,变量必须是最终的:否则有人可以从外部类更改它们的值,并且更改对内部类不可见。

关于java - 变量应该在监听器中是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969803/

相关文章:

java - @Consumes( {"application/xml,application/json"}) 如何编程返回类型

java - 正则表达式字符长度限制未通过单元测试

java - Spring - 从查询中获取结果集

JavaFX - 通过 CSS 在按钮之间添加空间

java - 如何在 JSTL if 语句中执行按位逻辑?

java - 如何在Java中使用indexOf

java - 启用按钮组

java - 通用 JSF 实体转换器

java - EditText 清除第一个焦点上的文本 - Android

java - 从数组生成变量以创建循环