文主要記錄:在JAVA中,(局部)內部類訪問某個局部變量,爲何這個局部變量必定須要用final 關鍵字修飾?安全
首先,什麼是局部變量?這裏的局部是:在方法裏面定義的變量。ide
所以,內部類可以訪問某局部變量,說明這個內部類不是在類中定義的內部類,而是在方法中定義的內部類,稱之爲:局部內部類。spa
局部變量的做用域:局部變量是在某個方法中定義,當該方法執行完成後,局部變量也就消失了。【局部變量分配在JVM的虛擬機棧中,這部份內存空間隨着程序的執行自動回收】,也即:局部變量的做用域是在 「方法的範圍內」。線程
可是,當(局部)內部類訪問 局部變量 時,會擴大局部變量的做用域。看下面一個示例:code
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中訪問 strblog
按理說:當程序執行到第19行時,main()方法就結束了,也即:主線程結束了。局部變量str的生命週期也應該結束了。生命週期
可是,Thread線程還未結束,在Thread線程中還可以打印局部str的值。這就代表:局部變量 str 做用域被擴大了。內存
所以,若是局部變量不用 final 修飾,咱們就能夠在(局部)內部類中隨意修改該局部變量值,並且是在 該局部變量的做用域範圍以外能夠看到這些修改後的值。這會致使一些問題(我也不知道什麼問題,安全性?)作用域
所以,JAVA就規定(局部)內部類訪問 的 局部變量必須用 final修飾,以防止更改局部變量的值。虛擬機