在Java中,当内部类(如匿名内部类)访问外部类的变量时,这些变量必须是final或有效地final,以确保它们的值不会在内部类中被更改。否则,编译器将引发“Variable 'name' is accessed from within inner class, needs to be final or effectively final”错误。以下示例给出了如何解决此问题:
public class OuterClass {
private int eye = 2;
public void method() {
final int legs = 4;
Runnable r = new Runnable() {
public void run() {
System.out.println("This animal has " + legs + " legs and " + eye + " eyes.");
}
};
Thread t = new Thread(r);
t.start();
}
}
在上面的代码中,变量“legs”是final的,因此可以在内部类中访问。然而,变量“eye”不是final的,因此编译器会抛出错误。为了解决这个问题,我们需要将“eye”变量设为有效的final,可以通过将其声明为最终赋值来实现,如下所示:
public class OuterClass {
public void method() {
int eye = 2;
final int legs = 4;
eye = 3; // we can still modify it here
Runnable r = new Runnable() {
public void run() {
System.out.println("This animal has " + legs + " legs and " + eye + " eyes.");
}
};
Thread t = new Thread(r);
t.start();
}
}
现在,我们可以在内部类中访问“eye”变量,因为它是有效的final变量。这是因为在匿名内部类中访问它时,在变量被赋值之后从未再次被赋值,所以它是有效的final