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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 窦超 黑马帝   /  2011-12-18 09:49  /  1704 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 窦超 于 2011-12-18 10:41 编辑

局部内部类为什么只能访问final局部变量,却可以随便访问成员变量?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

5 个回复

倒序浏览
宋双 黑马帝 2011-12-18 10:10:24
沙发
内部类定义在局部时可以直接访问外部类中的成员,是因为内部类中持有了一个外部类引用,格式为 外部类名.this。当访问它所在的局部中的变量时,只能访问被final修饰的局部变量。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
简单的来说是作用域的问题。就好像方法外面做的事情并不能改变方法内才定义的变量,因为你并不知道方法里面这个时候已经存在了这个局部变量了没有。在这个内部类中方法里面的本地变量是失效的,也就是不在作用域内,所以是不能够访问的

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
因为内部类虽然在方法内部,但是它有自己的存活时间,而方法调用完之后里面的局部变量就消失了
而用final修饰其值不能更改,相当于在内部类中创建了一个相同的变量,这个变量就不会随着方法的结束而消失了

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
段波 黑马帝 2011-12-18 10:26:57
报纸
这是由于它们的存活时间导致的:
      内部类的实例可以在方法结束后依然存活,局部变量在方法结束后却无法存活,所以在内部类中无法访问NON-final的局部变量;如果说加了final修饰就相当于一个常量,生命同期延长,于是便可以访问。
而成员变量的存活时间是取决于外部类的实例的,内部类实例中都会引用当前外部类实例,所以他们拥有一致的生命周期,于是可以访问成员变量。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
刘健 黑马帝 2011-12-18 11:47:10
地板
在内部类执行的时候,成员变量还是存在的,但是局部变量有可能已经被垃圾回收系统收回,所以不能访问,而final的局部变量不会被垃圾回收系统收回,所以可以访问

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马