本文主要記錄:在JAVA中,(局部)內部類訪問某個局部變量,爲什麼這個局部變量一定需要用final 關鍵字修飾?
首先,什麼是局部變量?這裏的局部是:在方法裏面定義的變量。
因此,內部類能夠訪問某局部變量,說明這個內部類不是在類中定義的內部類,而是在方法中定義的內部類,稱之爲:局部內部類。
局部變量的作用域:局部變量是在某個方法中定義,當該方法執行完成後,局部變量也就消失了。【局部變量分配在JVM的虛擬機棧中,這部分內存空間隨着程序的執行自動回收】,也即:局部變量的作用域是在 “方法的範圍內”。
但是,當(局部)內部類訪問 局部變量 時,會擴大局部變量的作用域。看下面一個示例:
1 public class Test { 2 3 public static void main(String[] args) { 4 final String str = "hapjin"; 5 6 new Thread(new Runnable() { 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(50); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 for(int i = 0; i < 10; i++) 15 System.out.println(str); 16 } 17 }).start(); 18 19 System.out.println("main thread finished"); 20 } 21 }
①第4行在main方法中定義了一個局部變量str,第6行定義了一個局部內部類Thread,並且在局部內部類Thread中訪問 str
按理說:當程序執行到第19行時,main()方法就結束了,也即:主線程結束了。局部變量str的生命週期也應該結束了。
但是,Thread線程還未結束,在Thread線程中還能夠打印局部str的值。這就表明:局部變量 str 作用域被擴大了。
因此,如果局部變量不用 final 修飾,我們就可以在(局部)內部類中隨意修改該局部變量值,而且是在 該局部變量的作用域範圍之外可以看到這些修改後的值。這會導致一些問題(我也不知道什麼問題,安全性?)
因此,JAVA就規定(局部)內部類訪問 的 局部變量必須用 final修飾,以防止更改局部變量的值。
原文:http://www.cnblogs.com/hapjin/p/5744478.html