本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰?

首先,什么是局部变量?这里的局部是:在方法里面定义的变量。

因此,内部类能够访问某局部变量,说明这个内部类不是中定义的内部类,而是在方法中定义的内部类,称之为:局部内部类。

局部变量的作用域:局部变量是在某个方法中定义,当该方法执行完成后,局部变量也就消失了。【局部变量分配在JVM的虚拟机栈中,这部分内存空间随着程序的执行自动回收】,也即:局部变量的作用域是在 “方法的范围内”。

但是,当(局部)内部类访问 局部变量 时,会扩大局部变量的作用域。看下面一个示例:

 public class Test {

     public static void main(String[] args) {
final String str = "hapjin"; new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 0; i < 10; i++)
System.out.println(str);
}
}).start(); System.out.println("main thread finished");
}
}

①第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

JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?的更多相关文章

  1. 匿名内部类可以访问的变量---静态成员变量和final修饰的局部变量

    在学习多线程的时候用到了匿名内部类,匿名内部类可以访问static静态成员变量或者final修饰的局部变量. 匿名内部类在编译之后会生成class文件,比如Test内的第一个匿名内部类编译之后就是Te ...

  2. java中的匿名内部类总结(转)

    源出处: java中的匿名内部类总结 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接 ...

  3. java中的匿名内部类

    匿名内部类在java编码中不是很常见,它可一让类实现多继承的特性(多个父类~1个子类) java中的匿名内部类总结http://www.cnblogs.com/nerxious/archive/201 ...

  4. Java 中的 protected 访问修饰符你真的了解吗?

    protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...

  5. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  6. Java 中不允许使用静态局部变量

    Java 中不允许使用静态局部变量

  7. Java中对不变的 data和object reference 使用 final

    Java中对不变的 data和object reference 使用 final 许多语言都提供常量数据的概念,用来表示那些既不会改变也不能改变的数据,java关键词final用来表示常量数据.例如: ...

  8. java中内部类使用小结

    内部类是指在一个外部类中再定义一个类,类名不需要和文件名相同 内部类可以是静态的,类的修饰符可以是private,default,protect,public修饰 ,而外部类只能是public 和 d ...

  9. java中内部类的讲解

    java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念.       在一个类的的 ...

随机推荐

  1. Properties类学习笔记

    1.Properties是一个hashTable子类,但它只装String类型的值2.一个Properties集中有一个子Properties集为它的默认属性集,如果在Properties中找不到相关 ...

  2. 微信小程序精品demo

    http://www.jianshu.com/p/0ecf5aba79e1 感谢笔者的分享!

  3. python函数嵌套定义

    python的这个特性是很特别的,与C#和C++都不一样.请看下面的例子 def outFun(): def innerFun_0():#1.在内部定义一个函数 print("i am fi ...

  4. debian系统的另一个包管理器aptitude

    最近在玩OPI的时候遇到了一个包因为各种依赖问题死活装不上.苦搜很久找到这个aptitude包管理器. 基于debain衍生的各种操作系统比较常用包管理器是apt,不过apt在遇到依赖问题的时候处理得 ...

  5. wampserver_x86_3.0.6 允许外网访问配置教程

    1.打开wamp目录下的apache配置文件中的httpd.conf 用可以看行数的编辑器打开 大概244行: 改为 <Directory /> AllowOverride none Re ...

  6. vue里面axios使用post

    let params = new URLSearchParams(); params.append('action', "login"); params.append('user' ...

  7. IOS 发布 升级新版本

    ERROR ITMS-90725: "SDK Version Issue. ERROR ITMS-90725: "SDK Version Issue. This app was b ...

  8. 面试小结之Elasticsearch篇(转)

    最近面试一些公司,被问到的关于Elasticsearch和搜索引擎相关的问题,以及自己总结的回答. Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenD ...

  9. JavaScript: For , For/in , For/of

    For: define: The for statement can customize how many times you want to execute code Grammar: for (c ...

  10. 关于https不支持http的解决方案

    由于在写md的时候截图是用的微博的图床,上传到github才发现不让在其他网站使用,所有本文只有一张图片. 刚才进行网站测试的时候,微博秀这个插件不能显示出来,一直是空白, 然后我把本地域名改成了12 ...