JAVA中內部類(匿名內部類)訪問的局部變量爲什麼要用final修飾?

本文主要記錄:在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章