黑马程序员技术交流社区
标题:
关于匿名内部类的问题
[打印本页]
作者:
沐有鱼丸
时间:
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