zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/hapjin/p/5744478.html
Copyright © 2011-2022 走看看