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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周靖轩 于 2014-9-17 18:55 编辑

用JDK8不用加final也可以直接访问,JDK1.7之必须要加final。
有大神解释一下原因吗,有些书上解释的模凌两可,没有直接说明原因的。
  1. class Outer{
  2.         //外部类方法
  3.         public void outerMethod(){
  4.                 //定义一个局部变量x。JDK8省略final后,方法中的内部类也可以直接访问该变量。试了一下,JDK7中不行。
  5.                 /*final*/ int x = 1;
  6.                
  7.                 //内部类
  8.                 class Inner{
  9.                         public void innerMethod(){
  10.                                 System.out.println(x);//JDK8中不加final,可以访问局部变量x,值为"
  11.                         }
  12.                                 
复制代码


16 个回复

倒序浏览
内部类的生命周期要比局部变量的时间长,局部变量时在栈里面,执行完就释放了,但是类不是在栈里面的
回复 使用道具 举报 1 0
好像有这么句话:局部内部类只能访问finally修饰的局部变量 仅供参考
回复 使用道具 举报 0 1
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
解决方法就是在局部变量前加修饰符final
,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
回复 使用道具 举报 5 0
不能直接掉 生命周期
回复 使用道具 举报
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

不错不错学习了
回复 使用道具 举报
学写了,感谢分享
回复 使用道具 举报
看来老师让我们用JDK7果然是有理由的。
回复 使用道具 举报
厉害受教了
回复 使用道具 举报
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

学习了,多谢多谢。
回复 使用道具 举报
嗯嗯.很多概念性的知识过后就忘了.
学得多忘得也多.
回复 使用道具 举报
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

有道理.....刚刚急救我啊!!!!
回复 使用道具 举报
赞一个,赞一个,赞一个,
回复 使用道具 举报
学习了,学习了,学习了
回复 使用道具 举报
不是不需要,只是编译器自动在源码里加了final,只不过不需要写明了。
回复 使用道具 举报
厉害了!!!
回复 使用道具 举报
服气了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马