很抱歉提出这样一个基本问题,但我无法理解,我不知道如何搜索它。
我有以下代码:
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
这究竟是什么意思?
答案 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!
}
};
}