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
JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?相关推荐
- java中的匿名内部类
匿名内部类在java编码中不是很常见,它可一让类实现多继承的特性(多个父类~1个子类) java中的匿名内部类总结 http://www.cnblogs.com/nerxious/archive/20 ...
- Java基础:Java中四种访问修饰符
一.背景. 这篇文章主要介绍了Java中四种访问修饰符详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下.放假在家里休息,闲来无事,想 ...
- Java中模拟浏览器访问网页(三)
Java中模拟浏览器访问网页(三) 转载:https://blog.csdn.net/qq122627018/article/details/51473150 一.前言 看完上一节中浏览器访问网页的行 ...
- 匿名内部类使用外部变量为什么必须是final修饰的
本文来说下为什么匿名内部类使用外部变量为什么必须是final修饰的 文章目录 疑问 分析 原因 原理 字节码 本文小结 疑问 在Java中,局部内部类如果调用了方法中的变量,那么该变量必须申明为fin ...
- c++中也有java中的匿名内部类
什么是内部类 将类写在其他类的内部,可以写在其他类的成员位置或局部位置,这种写在其他类内部的类就称为内部类.其他类也称为外部类. 什么时候使用内部类 在描述事物时,若一个事物内部还包含其他可能包含的事 ...
- java中四种默认的权限修饰符,Java中四种访问权限资料整理
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
- Java中四种访问权限总结
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.pro ...
- java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析
本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { ...
- Java中四种访问修饰符的区别
在java中共有4种访问级别,按访问权限由高到低为:public(公有的).protected(受保护的).友好的(没有任何访问权限关键字修饰)和private(私有的). 类型 类内部 同一个包其他 ...
最新文章
- 安天移动安全:Janus高危漏洞深度分析
- 【Qt】Qt中QJsonDocument 类
- exit()函数学习
- 企业的网站遭受木马攻击了,导致网站目录下所有文件都被篡改了
- 无线网络虚拟服务器,无线虚拟局域网
- Logistic Regression逻辑回归的简单解释
- libc.so.6被删后导致系统无法使用的原因及解决方法
- 在不推动提交的情况下触发Travis-CI重建?
- 用python把unix格式转换成windows格式
- MyEclipse修改项目名称
- 解压缩软件(winrar中文版)pjb 附使用说明
- 2013年全国统一题库考试-小型汽车驾照模拟考试C1,C2,C3,C4
- informatica学习1-数据仓库,ETL,数据仓库工具Informatica介绍
- Pycharm 专业版与社区版的区别
- 苹果蓝牙耳机平替哪个好用?商务通话蓝牙耳机推荐
- 经典算法-BF算法(字符串匹配)
- 如何看linux网络慢,Linux下网速慢的问题
- Java集合类和数组之间的相互转换
- 【数据挖掘】金山办公2020校招大数据和机器学习算法笔试题
- eclipse常用快捷方式