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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁林 金牌黑马   /  2011-10-8 21:21  /  2530 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请教大家为什么匿名内部类在使用一个外部定义的对象时要求这个参数引用是final的?

4 个回复

倒序浏览
本帖最后由 鲁蒙 于 2011-10-8 21:26 编辑

当方法被调用时,该方法中的局部变量在栈中被创建(诞生),当方法调用结束时(执行完毕),退栈,这些局部变量全部死亡。而:内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才能死亡。完全可能:一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。

评分

参与人数 1技术分 +2 收起 理由
李印东老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
就是楼上说的了 楼上也给我解释过,而且由final定义的变量也就相当与一个常量。版主,进不进的去第四期就看你给不给分了.....

评分

参与人数 1技术分 +1 收起 理由
李印东老师 + 1 鼓励下。

查看全部评分

回复 使用道具 举报
因为JAVA规定了匿名内部类只能使用final常量

因为匿名内部类没有构造函数,无法对引用变量进行初始化。所以引用的参数必须是在外部已经初始化的final变量。

因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
原因是内部类虽然在方法的内部,但是它的生命周期不会随着这个方法的结束而结束。内部类只有当没有引用指向他的时候内部类的生命周期才会结束。既然内部类定义在方法之中,那么如果他引用方法中的变量那么当这个方法结束的时候这个方法中的变量的生命也就结束了,而内部类还要引用这个变量,这时内部类的生命还在,但方法中的变量的生命却没有了,这就造成错乱了,所以为了解决这个问题就可以在方法中的变量加上final关键字,加上final之后那个变量也就成了常量,他的生命随着类的结束而结束,这样就保证了内部类不会在方法执行完之后一定可以引用到那个所谓的“变量”了。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 赞一个!

查看全部评分

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