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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈莹 中级黑马   /  2012-11-11 13:26  /  1816 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈莹 于 2012-11-13 22:01 编辑

为什么在匿名内部类中不能访问所在类的变量,而只能访问final类型的常量?这是什么原理啊?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。
      之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用
2,外部类要访问内部类,必须建立内部类对象。
内部类定义在局部时,
1,不可以被成员修饰符修饰
2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
        但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 很给力!

查看全部评分

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

而你说的情况是只有当要使用的变量是方法里面的变量,而且是在此方法内定义的类才有此限制
这个时候因为在这个内部类中方法里面的本地变量是失效的,也就是不在作用域内,所以是不能够访问的

但是为什么这里用final却又可以访问呢?
因为Java采用了一种copy local variable 的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以access local variable的假象

而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张雄 发表于 2012-11-11 13:45
内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。
      之所以可以直接访问外部类中 ...

这些规则我知道,我只是不知道原因,其中的原理是什么?
回复 使用道具 举报
许坤 发表于 2012-11-11 15:31
你说的应该是局部内部类
简单的来说是作用域的问题
就好像方法外面做的事情并不能改变方法内才定义的变量

copy local variable !谢谢,明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马