天天看點

局部内部類通路final局部變量

局部内部類(包括匿名局部内部類和普通内部類)中使用局部變量,那麼這個局部變量必須使用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修飾符修飾。