从内部类访问局部变量

时间:2012-12-17 19:17:55

标签: java

  

可能重复:
  Java local variable visibility in anonymous inner classes - why is ‘final’ keyword required?

我有这个功能可以创建一些按钮。我正在尝试在 doAction 方法中out.println item

    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

我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:3)

item标记为final,这应该可以解决问题。这solution

  

本地类可以绝对引用实例变量。该   他们不能引用非最终局部变量的原因是因为   方法返回后,本地类实例可以保留在内存中。   当方法返回局部变量时,超出范围,所以复制   他们是需要的。如果变量不是最终的那么副本   方法中的变量可以更改,而本地类中的副本   没有,所以他们不同步。

     

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

答案 1 :(得分:2)

制作item final应解决您的问题:

final String item = itemsList.get(i);

您无法像这样从内部或匿名类访问非最终本地变量。

答案 2 :(得分:1)

您需要使用final关键字。

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

由于匿名对象捕获item变量,因此在之后修改它是没有意义的。因此,您需要(拥有)使其不可变。