如何在函数内部使用变量

时间:2013-06-11 09:16:16

标签: java

很抱歉提出这样一个基本问题,但我无法理解,我不知道如何搜索它。

我有以下代码:

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

这究竟是什么意思?

5 个答案:

答案 0 :(得分:3)

在for循环中,像这样写:

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

因此,编译器知道对象o不会改变,即您不会使用=为其分配新值。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您无法执行System.out.println(o);

因为o未被定义为最终。

for (final Object o: abc)

答案 3 :(得分:2)

letters.get(i).addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)
    {
        System.out.println(o);
    }
});

创建一个内部类,只需使用final Object o使用foreach循环。

答案 4 :(得分: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!
        }
    };
}