可能重复:
Cannot refer to a non-final variable inside an inner class defined in a different method
我只是在尝试并提出问题。
当我从匿名内部类访问非final类变量时,为什么这是可以接受的:
static JLabel e = new JLabel("");
public static void main(String[] args) {
JButton b = new JButton("ok");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String l = e.getText();
}
});
}
但如果没有最终修饰符,则无法接受以下内容:
答案 0 :(得分:3)
因为类变量是静态的。
答案 1 :(得分:2)
我在下面修改了一下课程。希望这可以帮助您看到答案。
原始代码中的 e.getText()
只是以下代码中SomeClass.e.getText()
的简写。与SomeClass
相同的包中的任何类都可以对e.
进行类似的引用。
另一方面,与SomeClass
在同一个包中的其他类无法引用args
。
class SomeClass {
static JLabel e = new JLabel("");
public static void main(String[] args) {
JButton b = new JButton("ok");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String l = SomeClass.e.getText();
}
});
}
}
答案 2 :(得分:-2)
我几天前向其他人回答了这个问题
答案是args不在你的范围上下文中。如果它不是最终的,那么在调用actionPerformed方法时它可能已经改变了。在这种情况下,您将args视为另一个堆栈框架上可能存在或不存在的位置 - 这绝对是Java中的“不”。当你声明args final时,它可以将变量复制到你的内部类