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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 木森森 中级黑马   /  2015-3-14 22:08  /  2206 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Test26
  2. {
  3.         public void show()
  4.         {
  5.                 int x=8;
  6.                 class T
  7.                 {
  8.                         public void fun()
  9.                         {
  10.                                 System.out.println(x);
  11.                         }
  12.                 }
  13.                 new T().fun();
  14.         }
  15.         public static void main(String[]args)
  16.         {
  17.                 new Test26().show();
  18.         }
  19. }
复制代码
不是说内部类只能访问所在方法的被final修饰的局部变量么,这个代码为什么还能运行呢

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

27 个回复

正序浏览
jackwang 发表于 2015-3-20 09:33
已测试楼主的代码,结果编译不能通过,我的Jdk是1.6,告知从内部类中访问局部变量,局部变量必须被final修 ...

我用的是1.8的版本
回复 使用道具 举报
表示都忘记了,啦啦啦啦。。。
回复 使用道具 举报
小甲鱼 发表于 2015-3-20 10:10
局部变量分配内存在栈上,而对象内存在堆上。所以当函数运行完后(出栈)局部变量不存在了,而对象还存在。 ...

好吧,这是另类的说法。那个局部变量出栈了可能会发生意想不到的变化,所以用final限定
回复 使用道具 举报
局部变量分配内存在栈上,而对象内存在堆上。所以当函数运行完后(出栈)局部变量不存在了,而对象还存在。则局部变量要声明为final类型(相当于static)。也就是说延长局部变量的生命周期。

点评

final不能延长周期吧!只是不被修改而已吧  发表于 2015-3-20 10:42
回复 使用道具 举报
看来储备的还不够,不太了解
回复 使用道具 举报
已测试楼主的代码,结果编译不能通过,我的Jdk是1.6,告知从内部类中访问局部变量,局部变量必须被final修饰为最终类型,这是截图:


回复 使用道具 举报
看来我还得去复习复习,一知半解的
回复 使用道具 举报
wenke 中级黑马 2015-3-16 14:33:42
19#
我这里通过jdk1.8 编译通过  没问题   并且恢复一个疑问大家试试   
char[] arrs={'I','l','o','v','e','y','o','u'};
System.out.println(arrs);
输出竟然是Iloveyou  并不是类似[Char@3d2a 之类的内存地址    各位试试  帮忙解答一下
回复 使用道具 举报
夏鹏 发表于 2015-3-15 11:34
你 的局部内部类访问成员方法x so  你的x必须是final的才能编译通过
内部类定义在局部时不可以被成员修饰 ...

你不信就拿去运行一下嘛,回复不好发截图。千真万确。不止我一人没问题,你看看上面人的回复就知道了
回复 使用道具 举报

你 的局部内部类访问成员方法x so  你的x必须是final的才能编译通过
内部类定义在局部时不可以被成员修饰符修饰
不可以访问它所在的局部中的变量
只能访问被final修饰的局部变量
楼主 你确信你可以运行  请发截图
回复 使用道具 举报
wenke 发表于 2015-3-15 10:20
刚才试了试  无论x加不加final   System。out.println(x++);  x++都报错   也就是x永远不能被修改 ...

是真的哎,x变成了x++就会报错,看来方法中的局部变量被方法中的内部类调用之后就会自动隐式地被final修饰,不能再改变了。

点评

JDK1.8隐式的添加了final的缘故  发表于 2015-3-20 11:06
回复 使用道具 举报 2 0
wenke 中级黑马 2015-3-15 10:37:04
15#
设置成1.7了   一样运行  并没有报错
回复 使用道具 举报
表示JDK1.7的版本显示会报错!其他JDK版本不知道!
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:33:25
13#
好像意思是说如果局部内部类没有访问局部变量  那么局部变量就可以被修改  而一旦访问了局部变量 那么这个局部变量就不能再被修改 无论final与否

QQ截图20150315103218.png (14.36 KB, 下载次数: 7)

QQ截图20150315103218.png
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:20:06
12#
刚才试了试  无论x加不加final   System。out.println(x++);  x++都报错   也就是x永远不能被修改
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:16:39
11#
System.out.println(x-1); 这里打印的是x-1的值  并没有修改x的值呀
回复 使用道具 举报
本帖最后由 Jaybor 于 2015-3-15 10:16 编辑

内部类调用方法里的变量过程其实是将该变量拷贝一份到内部类里,这样即使方法里的变量死掉了那么也不会影响到内部类对象的使用;
如果变量是final的,那么拷贝品和原变量的变化就是同步的;反之,就会造成一种现象:明明内部类修改了方法里的变量,但是其值却根本没变;
回复 使用道具 举报
wenke 中级黑马 2015-3-15 09:59:37
9#
好像内部类访问方法内的参数变量  参数变量也必须是final   但刚才试了试 不加final 同样能够运行
回复 使用道具 举报
wenke 中级黑马 2015-3-15 09:55:57
8#
刚又回去看了看视频 这个地方当时还真没自己敲代码试过   按你的代码试了的确能运行 。 估计网上下的那个视频基于6.0 现在已经升级到java8 了   可能有些地方改了吗   
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马