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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王希悦 中级黑马   /  2015-1-15 13:47  /  1848 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类访问外部类成员是,为什么内部类只能访问被final修饰的局部变量,不可以访问它所在局部中变量啊

评分

参与人数 1技术分 +3 收起 理由
lwj123 + 3

查看全部评分

7 个回复

倒序浏览
个人理解 如果没final修饰,当类进内存的时候,这货还不知道在哪里呢,咋访问,类似于静态吧
回复 使用道具 举报
视频里将了吧,生命周期不同
回复 使用道具 举报
内部类的生命周期可能会比局部变量的生命周期长;用final修饰符修饰局部变量后, 局部变量的生命周期会延长
回复 使用道具 举报
局部变量随着方法的调用而存在,随着方法的结束而结束。
成员变量随着对象的存在,随着对象的小时而小时!
回复 使用道具 举报
这里说的是局部内部类吧,final修饰的变量是不会改变的,即使内部类所在的方法释放了,也不会可以访问这个变量
回复 使用道具 举报
这个问题,论坛都问很多了,而且问这个问题还加技术分了,我真是醉了
回复 使用道具 举报
原因:
   一, 当方法被调用运行完毕之后,局部变量就已消亡了。但内部类对象可能还存在,
           直到没有被引用时才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量。
                        
   二,解决这一问题的办法就是使用final修饰局部变量,通过将final局部变量"复制"一份,
         复制品直接作为方法内部类中的数据成员,这事方法内部类访问的其实是这个局部变量的复制品!
         而且,由于被final修饰的变量赋值后不能再修改,所以就保证了复制品与原始变量的一致。
                        
    三,原因二的功能能实现的原因是:Java采用了一种copy   local   variable(复制局部变量)的方式来实现,
            也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。
            从而造成了可以access   local   variable(访问局部变量)的假象,而这个时候由于不能重新赋值,
             所以一般不会造成不可预料的事情发生。
                        
     四, 使用final修饰符不仅会保持对象的引用不会改变,
            而且编译器还会持续维护这个对象在回调方法中的生命周期.
            所以这才是final变量和final参数的根本意义.
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马