黑马程序员技术交流社区

标题: 关于匿名内部类的问题 [打印本页]

作者: 沐有鱼丸    时间: 2013-6-18 10:41
标题: 关于匿名内部类的问题
这几天在看内部类,对匿名内部类和局部内部类只能访问final变量,这点不是很理解,请大家解答一下
作者: 吕祥艺    时间: 2013-6-18 12:06
只有局部内部类 他访问所在的局部变量的和他所在类中非静态变量的时候用final 方法区修饰变量的.....这个跟数据所存在的生命周期有关,
原因就是如果你这个类创建的对象还存在的时候,但是方法出栈的时候没有被final修饰的变量就随着方法一起出栈了,而被修饰过的变量就存储在常量池中.
作者: 郑晓飞    时间: 2013-6-18 12:10
生命周期不一样
作者: 郑晓飞    时间: 2013-6-18 12:10
生命周期不一样
作者: 张承富    时间: 2013-6-18 12:22
是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

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

但是为什么这里用final却又可以访问呢?
因为Java采用了一种copy   local   variable的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以access   local   variable的假象,而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生
作者: 袁梦希    时间: 2013-6-18 13:19
张承富 发表于 2013-6-18 12:22
是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定 ...

回答的很详细
作者: 袁梦希    时间: 2013-6-18 13:20
加油楼主 尽量把问题用代码
作者: 孙百鑫    时间: 2013-6-24 23:53
楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。{:soso_e100:}




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