2012-05-09 69 views
1

可能重复访问的变量:
Cannot refer to a non-final variable inside an inner class defined in a different method从Java匿名内部类

我只是尝试,并有一个问题。

为什么当我从一个匿名内部类访问非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(); 

      } 

     }); 

    } 

但是下面是不能接受的,而不final修饰符:

+1

到底是什么问题?为什么java的设计者选择只允许访问最终变量? – amit

+1

我觉得他问为什么,他可以访问此特定的非最终目标,而不是其他。除非我记错了(完全有可能),那是因为gettext的()返回一个字符串,这是不可改变的(因而隐含决赛)。 – Charles

回答

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

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

答案是args超出了你的范围上下文。如果它不是最终的,那么在你的actionPerformed方法被调用的时候它可能已经改变了。在这种情况下,你将参数视为另一个可能存在或可能不存在的栈帧的地方 - 这在Java中绝对是不可能的。当你声明最终的参数时,它可以将变量复制到你的内部类中

+0

这不是我问的问题... – mark

3

因为类变量是静态的。