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)。