A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 、海 中级黑马   /  2014-6-5 19:24  /  1515 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outer {
  2.         int x =3;
  3.         void method(){
  4.                 final int y =4;//此处为什么一定要用final修饰,求大神指点
  5.                
  6.                 class Inner{
  7.                         void function(){
  8.                                 System.out.println(y);
  9.                         }               
  10.                 }
  11.                 new Inner().function();
  12.         }

  13. }
复制代码

7 个回复

倒序浏览
因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被回收了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
回复 使用道具 举报
简单的说因为final的意思是最终的,无法改变的,这个输出结果也建议是最终的,安全性大大提高了!
回复 使用道具 举报
记得前面有人答过这个问题,说是和局部变量y的生命周期有关,当内部类方法function调用到局部变量y时,局部变量的值放在栈中保存的,随着方法调用的结束,栈会自动销毁局部变量y。而内部类对象却还存在着的,这就导致了调用不到局部变量y的情况发生。而用final相当于是复制了一份局部变量y,在局部变量销毁的时候,还能被调用到的假象。相当于是延长了y的生命周期。-----------不知道有没有理解错。

点评

原来如此!谢了  发表于 2014-6-5 22:51
回复 使用道具 举报 1 0
这里是局部内部类,局部内部类想要访问局部变量,这个局部变量必须要被final修饰才能访问;
楼主可以检验一下,应该是属于内部类的小知识。
回复 使用道具 举报
楼上正解啊。
回复 使用道具 举报
用final修饰后的成员变量 会变成常量 延长变量的生命周期 以便访问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马