-2

可能重复:
匿名内部类中的 Java 局部变量可见性 - 为什么需要“最终”关键字?

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

    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

我该如何以正确的方式做到这一点?

4

3 回答 3

3

标记itemfinal,这应该可以解决问题。这个解决方案

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

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

于 2012-12-17T19:19:21.653 回答
2

制作itemfinal 应该可以解决您的问题:

final String item = itemsList.get(i);

您不能像这样从内部或匿名类访问非最终局部变量。

于 2012-12-17T19:19:15.990 回答
1

您需要使用final关键字。

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

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

于 2012-12-17T19:19:12.777 回答