本文主要记录:在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

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

  1. java中的匿名内部类

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

  2. Java基础:Java中四种访问修饰符

    一.背景. 这篇文章主要介绍了Java中四种访问修饰符详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下.放假在家里休息,闲来无事,想 ...

  3. Java中模拟浏览器访问网页(三)

    Java中模拟浏览器访问网页(三) 转载:https://blog.csdn.net/qq122627018/article/details/51473150 一.前言 看完上一节中浏览器访问网页的行 ...

  4. 匿名内部类使用外部变量为什么必须是final修饰的

    本文来说下为什么匿名内部类使用外部变量为什么必须是final修饰的 文章目录 疑问 分析 原因 原理 字节码 本文小结 疑问 在Java中,局部内部类如果调用了方法中的变量,那么该变量必须申明为fin ...

  5. c++中也有java中的匿名内部类

    什么是内部类 将类写在其他类的内部,可以写在其他类的成员位置或局部位置,这种写在其他类内部的类就称为内部类.其他类也称为外部类. 什么时候使用内部类 在描述事物时,若一个事物内部还包含其他可能包含的事 ...

  6. java中四种默认的权限修饰符,Java中四种访问权限资料整理

    一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...

  7. Java中四种访问权限总结

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.pro ...

  8. java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析

    本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { ...

  9. Java中四种访问修饰符的区别

    在java中共有4种访问级别,按访问权限由高到低为:public(公有的).protected(受保护的).友好的(没有任何访问权限关键字修饰)和private(私有的). 类型 类内部 同一个包其他 ...

最新文章

  1. 安天移动安全:Janus高危漏洞深度分析
  2. 【Qt】Qt中QJsonDocument 类
  3. exit()函数学习
  4. 企业的网站遭受木马攻击了,导致网站目录下所有文件都被篡改了
  5. 无线网络虚拟服务器,无线虚拟局域网
  6. Logistic Regression逻辑回归的简单解释
  7. libc.so.6被删后导致系统无法使用的原因及解决方法
  8. 在不推动提交的情况下触发Travis-CI重建?
  9. 用python把unix格式转换成windows格式
  10. MyEclipse修改项目名称
  11. 解压缩软件(winrar中文版)pjb 附使用说明
  12. 2013年全国统一题库考试-小型汽车驾照模拟考试C1,C2,C3,C4
  13. informatica学习1-数据仓库,ETL,数据仓库工具Informatica介绍
  14. Pycharm 专业版与社区版的区别
  15. 苹果蓝牙耳机平替哪个好用?商务通话蓝牙耳机推荐
  16. 经典算法-BF算法(字符串匹配)
  17. 如何看linux网络慢,Linux下网速慢的问题
  18. Java集合类和数组之间的相互转换
  19. 【数据挖掘】金山办公2020校招大数据和机器学习算法笔试题
  20. eclipse常用快捷方式

热门文章

  1. 使用JavaMail技术发送邮件
  2. Object类的用法(二)
  3. Cerberus 银行木马开发团队解散,源代码5万美元起拍
  4. PHP如何获取用户IP地址
  5. 11.29晚 心情 晴 既然选择了Linux这条路就要坚持走下去
  6. day1: python3.5学习
  7. 相机获取的照片向左自动旋转90度解决方法
  8. 【Oracle学习笔记】
  9. 工具,帮助我们更高效的工作
  10. linux基础学习之关机命令总结