Java - 从匿名内部类访问变量

时间:2012-05-09 21:53:55

标签: java inner-classes

  

可能重复:
  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();

            }

        });

    }

但如果没有最终修饰符,则无法接受以下内容:

3 个答案:

答案 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时,它可以将变量复制到你的内部类