2

很抱歉问了这么一个基本问题,但我就是想不通,我不知道如何搜索它。

我有以下代码:

letters = new ArrayList<JButton>();
String[] abc = new String[] {"A", "Á", "B", "C", "D", "E", "É", "F", "G", "H", "I", "Í", "J", "K", "L", "M", "N", "O", "Ó", "Ö", "Ő", "P",
        "Q", "R", "S", "T", "U", "Ú", "Ü", "Ű", "V", "W", "X", "Y", "Z" };
for (Object o: abc)
{
    letters.add(new JButton((String)o));
    int i = letters.size() - 1;
    letters.get(i).setBounds(i%10 * 60 + 40, 350 + ((i / 10) * 50), 55, 45);
    letters.get(i).addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent event)
        {
            System.out.println(o);
        }
    });
    mF.add(letters.get(i));
}

如您所见,我有一个 for 循环,我想在函数内使用它的变量 'o'。我怎样才能做到这一点?它说:

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

这到底是什么意思?

4

5 回答 5

3

在 for 循环中,这样写:

for (final Object o: abc)
{
    ...

所以编译器知道对象o不会改变,即你不会用=.

于 2013-06-11T09:18:41.833 回答
3

这意味着要在内部类中访问,编译器必须确保无法修改此变量,因为代码可能会异步执行。更改for (Object o: abc)for (final String o: abc)

于 2013-06-11T09:19:06.550 回答
2
letters.get(i).addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)
    {
        System.out.println(o);
    }
});

正在创建一个内部类,只需让 foreach 循环使用final Object o.

于 2013-06-11T09:19:47.063 回答
2

你不能执行System.out.println(o);

因为 o 没有被定义为最终的。

for (final Object o: abc)
于 2013-06-11T09:19:26.483 回答
1

您正在使用匿名内部类,并且可以从这些类中访问外部声明的最终变量。这是一个不起作用的示例,因为消息不是最终的:

public void myMethod() {
    String message = "You can't see me";

    new SomeInterface() {

        //SomeInterface declares this method:
        public void someMethod() {
            System.out.println(message); //this will not compile
        }
    };
}

但这会起作用,因为消息是最终的:

public void myOtherMethod() {
    final String message = "You can see me now!";

    new SomeInterface() {

        //SomeInterface declares this method:
        public void someMethod() {
            System.out.println(message); //this will work!
        }
    };
}
于 2013-06-11T09:24:58.963 回答