黑马程序员技术交流社区

标题: 方法中的内部类能不能访问方法中的局部变量,为什么? [打印本页]

作者: 周靖轩    时间: 2014-9-17 18:51
标题: 方法中的内部类能不能访问方法中的局部变量,为什么?
本帖最后由 周靖轩 于 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.                                 
复制代码



作者: Fightin黑马    时间: 2014-9-17 22:23
内部类的生命周期要比局部变量的时间长,局部变量时在栈里面,执行完就释放了,但是类不是在栈里面的
作者: 郑飞    时间: 2014-9-18 05:17
好像有这么句话:局部内部类只能访问finally修饰的局部变量 仅供参考
作者: lipc    时间: 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
解决方法就是在局部变量前加修饰符final
,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
作者: 马鹏涛    时间: 2015-5-29 13:19
不能直接掉 生命周期

作者: 路人乙1989    时间: 2015-7-12 23:17
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

不错不错学习了
作者: Hi大智    时间: 2016-2-4 20:37
学写了,感谢分享
作者: 宋达思    时间: 2016-2-4 21:19
看来老师让我们用JDK7果然是有理由的。
作者: 青争心    时间: 2016-4-2 18:47
厉害受教了
作者: 小海龙    时间: 2016-4-12 20:22
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

学习了,多谢多谢。
作者: guozhicheng    时间: 2016-4-24 19:56
嗯嗯.很多概念性的知识过后就忘了.
学得多忘得也多.

作者: 善良的死神达乐    时间: 2016-6-16 18:00
lipc 发表于 2014-9-18 14:27
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...

有道理.....刚刚急救我啊!!!!
作者: zztierlie    时间: 2016-8-14 14:16
赞一个,赞一个,赞一个,
作者: zztierlie    时间: 2016-8-14 17:11
学习了,学习了,学习了
作者: 水月灬清影    时间: 2016-8-15 19:01
不是不需要,只是编译器自动在源码里加了final,只不过不需要写明了。
作者: rodgerun    时间: 2016-11-3 23:31
厉害了!!!
作者: wthandsome    时间: 2017-5-28 01:24
服气了!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2