问题
Possible Duplicate:
Cannot refer to a non-final variable inside an inner class defined in a different method
I'm just experimenting and have a question.
Why is this acceptable when I am accessing a non-final class variable from an anonymous inner class:
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();
}
});
}
But the following is not acceptable without the final modifier:
回答1:
I modified the class a little below. Hopefully this can help you see the answer.
e.getText()
in the original code is just shorthand for SomeClass.e.getText()
in the below code. Any class in the same package as SomeClass
could make a similar reference to e.
.
On the other hand, other classes in the same package as SomeClass
can not refer to 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:
Because the class variable is static.
回答3:
I answered this question to someone else a few days ago
The answer is that args is out of your scope context. If its not final, it could have changed by the time your actionPerformed method gets called. In that case, you are treating args as a place on another stackframe that may or may not still exist - this is definitely a no no in Java. When you declare args final, it can copy over the variable into your inner class
来源:https://stackoverflow.com/questions/10524635/java-accessing-variables-from-an-anonymous-inner-class