黑马程序员技术交流社区

标题: 匿名内部类和final常量 [打印本页]

作者: 陈莹    时间: 2012-11-11 13:26
标题: 匿名内部类和final常量
本帖最后由 陈莹 于 2012-11-13 22:01 编辑

为什么在匿名内部类中不能访问所在类的变量,而只能访问final类型的常量?这是什么原理啊?
作者: 朝花夕拾    时间: 2012-11-11 13:45
内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。
      之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用
2,外部类要访问内部类,必须建立内部类对象。
内部类定义在局部时,
1,不可以被成员修饰符修饰
2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
        但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
作者: 许坤    时间: 2012-11-11 15:31
你说的应该是局部内部类
简单的来说是作用域的问题
就好像方法外面做的事情并不能改变方法内才定义的变量
因为你并不知道方法里面这个时候已经存在了这个局部变量了没有

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

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

而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生
作者: 陈莹    时间: 2012-11-13 21:56
张雄 发表于 2012-11-11 13:45
内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。
      之所以可以直接访问外部类中 ...

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

copy local variable !谢谢,明白了!




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