方法中的内部类如果要访问局部变量就必须把局部变量设置成final类型。
为什么要设置成final局部变量才能被访问:
例如:方法go开始,初始化匿名内部类Timer子类,并调用start()方法启动定时器,方法actionPerformed 被调用,go方法结束,此时go方法的delay和flag不复存在。
所以在方法go结束后,定时如果要继续进行必须把flag声明为final。
public void go(final boolean flag){
final long delay;
class Inner{
new Timer(a,new ActionListener(){
public void actionPerformed(ActionEvent e){
if(flag){
System.out.println("one second");
}
}
}).start();
}
}
为了让actionPerformed方法继续工作。编译器会检测对局部变量的引用,并在内部类初始化的时候通过构造器把参数传入局部内部类的拷贝域中,把它们初始化为局部变量的副本。由于flag是final常量,初始化之后无法更改,所以在内部类的拷贝和局部变量始终是一致的。
上面例子中的timer是一个定时器,楼主只要知道在go()这个方法执行结束之后,还有Inner这个匿名内部类的一个实例存在,并且还会调用它的方法。 |