1

可能重复:
无法引用在不同方法中定义的内部类中的非最终变量

我只是在做实验,有一个问题。

为什么当我从匿名内部类访问非最终类变量时这是可以接受的:

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();

            }

        });

    }

但是如果没有 final 修饰符,以下内容是不可接受的:

4

3 回答 3

3

因为类变量是静态的。

于 2012-05-09T22:00:14.350 回答
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();

            }

        });

    }
}
于 2012-05-09T22:08:48.907 回答
-2

前几天我给别人回答了这个问题

答案是 args 超出了您的范围上下文。如果它不是最终的,它可能会在你的 actionPerformed 方法被调用时发生变化。在这种情况下,您将 args 视为另一个可能存在或可能不存在的堆栈帧上的一个位置 - 这在 Java 中绝对是不可以的。当您声明 args final 时,它可以将变量复制到您的内部类中

于 2012-05-09T21:59:26.667 回答