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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM