局部内部類(包括匿名局部内部類和普通内部類)中使用局部變量,那麼這個局部變量必須使用final修飾。這裡說的事局部内部類,不是普通靜态内部類和非靜态内部類,因為他們不能通路方法體内的局部變量。 java要求所有被局部内部類通路的局部變量都是用final修飾是因為:對于普通局部變量他的作用域就是該方法内,當方法結束該局部變量就随之消失;但局部内部類可能産生隐式的“閉包”,閉包将使得局部變量脫離他所在的方法繼續存在。請看下面的例子是局部變量脫離他所在的方法繼續存在的例子: public class ClosureTest
{
public static void main(String[] args)
{
//定義一個局部變量
final String str = "Java";
//在内部類裡通路局部變量str
new Thread(new Runnable()
{
public void run()
{
for (int i = 0; i < 100 ; i++ )
{
//此處将一直可以通路到str局部變量
System.out.println(str + " " + i);
//暫停0.1秒
try
{
Thread.sleep(100);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
}).start(); //①
//執行到此處,main方法結束
}
} 上面定義了一個局部變量str。正常情況下,當程式執行完①行代碼之後,main方法的生命周期就結束了,局部變量str的作用域也會随之結束。但隻要新線程裡run方法沒有執行完,匿名内部類的生命周期就沒有結束,将一直可以通路str局部變量的值,這個就是内部類會擴大局部變量作用域的執行個體。 由于内部類可能擴大局部變量的作用域,如果再加上這個被内部類通路的局部變量沒有使用final修飾,也就是說這個變量的值可以随時改變,那将引起極大的混亂,是以java編譯器要求所有被内部類通路的局部變量必須使用final修飾符修飾。