此处的内部类指局部内部类(包括匿名内部类),因为只有局部内部类才可访问局部变量,普通非静态内部类和静态内部类不可能访问方法体内的局部变量。
需用final修饰的原因:
对于局部变量,作用域为该方法内,方法执行结束该局部变量也随之消失。但内部类可能会产生隐式的“闭包”,闭包使局部变量脱离它所在的方法继续存在。
public class ClosureTest
{
public static void main(String[] args)
{
final String str = "Java";
new Thread(new Runnable() {
public void run() {
for(int i = 0; i < 100; ++i)
System.out.println(str + " " + i);
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();//此处执行完,main方法结束。但只要线程的run()未执行完,str的生命周期就没结束。
}
}
上例中内部类扩大了局部变量的作用域,若没用final修饰,也即变量的值可以随意改变,将会引起混乱。