2012-12-17 109 views
-2

可能重复:
Java local variable visibility in anonymous inner classes - why is ‘final’ keyword required?访问本地变量从内部类

我有这个功能,创建一些按钮。我试图out.println 项目doAction方法。

for (int i = 0; i < itemsList.size(); i++) { 
     String item = itemsList.get(i); 
     TButton button = new TButton("" + item, 8, 415 + (25 * i), 90, 25) { 
      public void doAction() { 
       System.out.println("" + item); 
      } 
     }; 
     this.framework.add(button); 
    } 

,我发现了错误

local variable item is accessed from within inner class 

如何做到这一点的正确方法?

+0

我认为,如果你声明'item'为'final'您的代码将工作 –

回答

2

制作item最终应该解决您的问题:

final String item = itemsList.get(i); 

你不能这样从内部或匿名类访问非final局部变量。

1

您需要使用final关键字。

尝试final String item=itemsList.get(i);

由于匿名对象捕获item变量,因此修改它之后没有任何意义。因此你需要()使它不可变。

3

马克item作为final,这应该可以解决问题。这solution

本地类可以肯定地引用实例变量。 由于它们不能引用非最终本地变量,原因是在方法返回后,本地类实例可以保留在内存中。 当方法返回局部变量超出范围时,所以需要它们的副本 。如果变量不是最终的,那么方法中 变量的副本可能会发生变化,而本地类 中的副本没有变化,所以它们会不同步。

匿名内部类需要最终变量,因为它们在Java中实现的方式为 。匿名内部类(AIC)通过创建一个私有实例字段使用 局部变量,该字段包含局部变量值的 副本。内部类不是 实际使用本地变量,而是一个副本。它应该是相当 在这一点上很明显,如果 原始值或复制值发生变化,可能会发生“坏事”?会出现一些意外的数据同步问题 。为了防止这种问题,Java要求您标记局部变量,将作为最终(即不可更改)由AIC使用。这保证 内部类的局部变量副本将始终匹配 的实际值。

+0

所以这个问题是一个重复.. –

+0

@LewsTherin我会这么说,我已经标记它是这样的OP – Woot4Moo

+0

@LewsTherin你也可能会关闭它,以便我们可以远程清理网站。 – Woot4Moo