这里的局部变量就是在类方法中的变量,能访问方法中变量的类当然也是局部内部类了。
我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。例如下面的代码:

class Outer{                                                                       public static void main(String[] args){ Outer out = new Outer(); Object obj = out.method(); } Object method(){ int locvar = 1; class Inner{ void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(); return in; } } 

当out.method()方法执行结束后,局部变量 locvar 就消失了,但是在method()方法中 obj in = new Inner() 产生的 in 对象还存在引用obj,这样对象就访问了一个不存在的变量,是不允许的。这种矛盾是由局部内部类可以访问局部变量但是局部内部类对象和局部变量的生命周期不同而引起的。

局部内部类访问局部变量的机制

在java中,类是封装的,内部类也不例外。我们知道,非静态内部类能够访问外部类成员是因为它持有外部类对象的引用 Outer.this, 就像子类对像能够访问父类成员是持有父类对象引用super一样。局部内部类也和一般内部类一样,只持有了Outer.this,能够访问外部类成员,但是它又是如何访问到局部变量的呢?

实际上java是将局部变量作为参数传给了局部内部类的构造函数,而将其作为内部类的成员属性封装在了类中。我们看到的内部类访问局部变量实际上只是访问了自己的成员属性而已,这和类的封装性是一致的。那么上面的代码实际上是这样:

Object method(){int locvar = 1; class Inner{ private int obj; public Inner(int obj){ this.obj = obj; } void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(locvar); //将locvar作为参数传给构造,以初始话成员 return in; } 

那么问题又来了,我们写代码的目的是在内部类中直接控制局部变量和引用,但是java这么整我们就不高兴了,我在内部类中整半天想着是在操作外部变量,结果你给整个副本给我,我搞半天丫是整我自己的东西啊?要是java不这么整吧,由破坏了封装性--------你个局部内部类牛啊,啥都没有还能看局部变量呢。这不是java风格,肯定不能这么干。这咋整呢?
想想,类的封装性咱们一定是要遵守的,不能破坏大局啊。但又要保证两个东西是一模一样的,包括对象和普通变量,那就使用final嘛,当传递普通变量的之前我把它变成一个常量给你,当传递引用对象的时候加上final就声明了这个引用就只能指着这一个对象了。这样就保证了内外统一。

转:https://segmentfault.com/a/1190000002735907

转载于:https://www.cnblogs.com/xh0102/p/5729381.html

内部类访问局部变量的时候,为什么变量必须加上final修饰相关推荐

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

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

  2. java 中final修饰的变量_java中final修饰符的使用方法

    本文为大家分享了java中final修饰符的使用,供大家参考,具体内容如下 1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可 ...

  3. 为什么一些人喜欢在java代码中能加final的变量都加上final

    我记得第一次看到这种写法是在看慕课网的课程,毕竟是小白,我记得当时我对于android并不是感觉很清晰,虽然现在也好不了多少.那时候我已经读过了闫博士的<java与模式>一书,如果人名记错 ...

  4. java lambda 局部变量_java Lambda表达式访问局部变量详细介绍

    此前给大家带来了java Lambda表达式访问成员变量详细介绍,下面就要继续给大家介绍java Lambda表达式访问局部变量的内容,一起通过简单的文章来进行了解吧. 对于成员变量的访问Lambda ...

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

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

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

    本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...

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

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

  8. final修饰变量、方法、类的作用

    1.final修饰类 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展, ...

  9. 被final修饰的变量到底能不能被修改

    final:可以修饰类,方法,变量: 对类的修饰:表示类不可以被继承: 对方法修饰:表示该方法不能被子类重写: 对变量修饰:表示该变量不能被修改: 不知道大家有没有遇到一些很奇怪的现象,就是被fina ...

最新文章

  1. uiswitchbutton 点击不改变状态_Redux 包教包会(一):解救 React 状态危机
  2. eclipse java代码乱码怎么解决_eclipse java 乱码怎么解决
  3. Docker框架使用系列教程(七)Dockerfile镜像创建
  4. nginx优化-nginx事件处理模型优化use epoll;
  5. JS中的正则表达式小小的技巧---TEST方法的使用
  6. C++有符号和无符号数的转换
  7. 如何把密度函数化为标准正态二维分布_概率微课:第三章(22) 二维随机变量及分布函数定义...
  8. ZZULIOJ 1090: 整数幂(多实例测试)
  9. 软件测试--cookie学习
  10. leetcode求众数
  11. paip.mysql 性能测试by mysqlslap
  12. JSON 的 MIME 类型
  13. freeswitch cdr mysql_freeswitch XML CDRS
  14. python遍历json_python3如何遍历json数据
  15. XUI -Android原生UI框架的配置
  16. codeforces1467D. Sum of Paths
  17. android如何替换contact的来电铃声
  18. js中的json和ascii转换
  19. MYSQL数据库误删除恢复笔记收藏
  20. PXE的原理与配置方式

热门文章

  1. Oracle中Number(p,s)的意义
  2. 前端小知识点(8):作者为什么设计原型
  3. [html] 解释下什么是ISISO8859-2字符集?
  4. [css] 你对视网膜(Retina)分辨率有了解吗?有没有在实际中使用过?
  5. [js] axios拦截器原理是什么?
  6. 前端学习(2853):简单秒杀系统学习之页面事件
  7. 工作295:发布逻辑处理
  8. 前端学习(2522):添加博客的样式
  9. “约见”面试官系列之常见面试题之第七十八篇之fetch(建议收藏)
  10. 前端学习(1870)vue之电商管理系统电商系统之配置message全局弹框组件