1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的
2)为什么JAVA中要加上一条限制:只能访问final型的局部变量?
3)JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译技术是无法实现的或代价极高.
4)困难在何处?到底难在哪儿?
局部变量的生命周期与局部内部类的对象的生命周期的不一致性!
5)设方法f被调用,从而在它的调用栈中生成了变量i,此时产生了一个局部内部类对象inner_object,它访问了该局部变量i .当方法f()运行结束后,局部变量i就已死亡了,不存在了.但:局部内部类对象inner_object还可能一直存在(只能没有人再引用该对象时,它才会死亡),它不会随着方法f()运行结束死亡.这时:出现了一个"荒唐"结果:局部内部类对象inner_object要访问一个已不存在的局部变量i!
6)如何才能实现?当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访问局部变量时,其实真正访问的是这个局部变量的"复制品"(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(其实访问的是"复制品"),给人的感觉:好像是局部变量的"生命期"延长了.
那么:核心的问题是:怎么才能使得:访问"复制品"与访问真正的原始的局部变量,其语义效果是一样的呢?
当变量是final时,若是基本数据类型,由于其值不变,因而:其复制品与原始的量是一样.语义效果相同.(若:不是final,就无法保证:复制品与原始变量保持一致了,因为:在方法中改的是原始变量,而局部内部类中改的是复制品)

当变量是final时,若是引用类型,由于其引用值不变(即:永远指向同一个对象),因而:其复制品与原始的引用变量一样,永远指向同一个对象(由于是final,从而保证:只能指向这个对象,再不能指向其它对象),达到:局部内部类中访问的复制品与方法代码中访问的原始对象,永远都是同一个即:语义效果是一样的.否则:当方法中改原始变量,而局部内部类中改复制品时,就无法保证:复制品与原始变量保持一致了(因此:它们原本就应该是同一个变量.)

一句话:这个规定是一种无可奈何.也说明:程序设计语言的设计是受到实现技术的限制的.这就是一例. 因为:我就看到不少人都持这种观点:设计与想法是最重要的,实现的技术是无关紧要的,只要你作出设计与规定,都能实现.

转载于:https://www.cnblogs.com/mjblogs/p/4971630.html

局部内部类访问方法中的局部变量为什么加final相关推荐

  1. 局部内部类访问它所在方法中的局部变量必须是final

    https://www.cnblogs.com/oldpub-blog/p/9026824.html https://blog.csdn.net/whuslei/article/details/625 ...

  2. 第三次学JAVA再学不好就吃翔(part43)--局部内部类访问局部变量

    学习笔记,仅供参考 面向对象 局部内部类访问局部变量 啥叫局部内部类? 局部内部类是指在方法中定义的内部类. 举个例子(访问局部内部类) 局部内部类: class InnerTest1 {public ...

  3. java 反射 main_java – 通过反射访问main方法中的局部变量

    Since main is static, is it possible to access instanceOfB in order to access the value of _nonStati ...

  4. 为什么局部内部类访问外边的局部变量必须为final?

    6.局部内部类访问外边的局部变量时,此变量必须为final类型  由于技术方面的限制,java的设计者们做出如下语法规定:局部内部类访问外边的局部变量时,此变量必须为final类型,(为什么请参考我的 ...

  5. java final成员变量吗_阳光沙滩博客-为什么Java匿名内部内使用局部变量需要加final?而访问成员变量却不用加final呢?...

    前置知识 内存数据区域(Java内存结构) 在解析这个问题之前,得先有一些前置知识. 比如说,要知道什么是堆,什么是栈,什么是方法区,这数据区域存放什么内容? 可以参考这篇文章: 栈里面存放方法内容 ...

  6. java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

    final关键字: final表示最终的不可变的,在java中可以用来修饰类或方法.局部变量.成员变量. // 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表 ...

  7. 局部内部类 java 1614958356

    局部内部类 java 1614958356 关于 定义局部内部类 定义在方法中的类 局部内部类不可以加访问修饰符 局部内部类里面的成员属性可以加访问修饰符 访问外部类的属性 可以直接访问 相当于 访问 ...

  8. Java 内部类、局部内部类、静态内部类使用

    1.上代码: //局部内部类.静态内部类.匿名类接口仅仅解决了多继承的部分问题,内部类有效实现了多重继承package ClassN1;public final class InnerClass {p ...

  9. JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类   作用 要想 ...

最新文章

  1. (C++)A+B 输入输出练习VI 每行的第一个数N,表示本行后面有N个数。
  2. SpringDataJpa框架单元测试实现增删改查
  3. 安装OpenResty,实现分发层、应用层nginx+lua开发(附加问题:bad argument #2 to ‘set_keepalive‘ (number expected, got nil)
  4. 【转】Unity中写GLSL(一)—— 简单的diffuse color
  5. sysbench对数据库的性能测试
  6. leetcode205. 同构字符串 一般人一次做不对的简单题
  7. 第62课 捉迷藏 《小学生C++趣味编程》
  8. Python高级——property属性
  9. redis aof命令缓冲区的写入源码
  10. k8s查看pod的yaml文件_每天5分钟|轻松掌握开发工作中必会的k8s-yaml配置说明和常用命令...
  11. pip 安装GPU版本pytorch 与cuda下载
  12. html5 判断手机横竖屏,移动端判断横竖屏的5种解决方案
  13. python 报错: unindent does not match any outer indentation level
  14. wifi无线监控摄像头怎么安装 室内怎么安装监控摄像头
  15. 手动编译kernel和supplicant使树莓派支持wpa3
  16. Spring 测试运行的时候提示 Unable to find a @SpringBootConfiguration 错误
  17. 软件测试密码修改教程,软件测试之用户注册和密码修改测试用例设计
  18. 次世代游戏建模制作工作流程 1
  19. 爬虫实战 | 手把手用Python教你采集可视化知乎问题的回答(内附代码)
  20. 计算机应用领域中CAL代表,计算机应用领域.doc

热门文章

  1. 如何设计一个牛逼的本地缓存
  2. 图解Transformer(完整版)!
  3. 2020 年度最佳的23个机器学习项目!(附源代码)
  4. 灵魂拷问:你看过Xgboost原文吗?
  5. 支持向量机(SVM)
  6. 特征工程(四)HashingVectorizer
  7. AI都会写灵魂Rap了?Transformer跨界说唱,节奏、流畅度都不在话下
  8. 8 个 Python 高效数据分析的技巧
  9. Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
  10. Flask开发服务器启动方式