Java-从匿名内部类访问变量
可能重复:Java-从匿名内部类访问变量,java,inner-classes,Java,Inner Classes,可能重复: 我只是在试验,有个问题 当我从匿名内部类访问非final类变量时,为什么这是可以接受的: static JLabel e = new JLabel(""); public static void main(String[] args) { JButton b = new JButton("ok"); b.addActionListener(new ActionListener() { @Override
我只是在试验,有个问题 当我从匿名内部类访问非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();
}
});
}
但是,如果没有最后的修饰语,以下内容是不可接受的:我几天前向其他人回答了这个问题
答案是args超出了您的上下文范围。如果它不是final,那么在调用actionPerformed方法时它可能已经改变了。在这种情况下,您将args视为另一个stackframe上的一个位置,该位置可能仍然存在,也可能不存在,这在Java中绝对是不存在的。声明args final时,它可以将变量复制到内部类中,因为类变量是静态的。我在下面稍微修改了类。希望这能帮助你找到答案 原始代码中的
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();
}
});
}
}
问题到底是什么?为什么java的设计者选择只允许访问最终变量?我想他是在问为什么他可以访问这个特定的非最终对象,而不能访问另一个。除非我弄错了(完全有可能),否则这是因为getText()返回的字符串是不可变的(因此是隐式的final)。