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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一个方法中的内部类为什么不能访问方法中的局部变量?还有为什么在局部变量前面加上final关键字就能访问了呢?昨天晚上学刚学的面向对象的类,这个内部类和局部变量的关系有点迷糊,百度了一些答案,有从栈堆角度解释的,有从生命周期和作用域解释的,看得不是太懂,大家给点通俗的讲解啊,谢谢了

4 个回复

倒序浏览
黑马网友  发表于 2011-9-2 13:05:47
沙发
非final的变量在方法执行完毕后会被销毁的,如果内部类能访问方法中的局部变量,并且返回自己,那么内部类的对象并没有被销毁,但是方法中的局部变量却应该被销毁,这样当然不能访问。就像造船的时候木板必须定义为final一样,如果木板不是final,在船下水的时候木板要被销毁,那船就只能沉水了。。。不知道这样你能明白不。
回复 使用道具 举报
黑马网友  发表于 2011-9-2 13:56:09
藤椅
首先方法中定义有一个内部类,我们只是为了控制这个类的可见性,它并不是方法的一部分我们只是代码这样写,
目的是为了控制内部类的可见性,编译之后的结果,也会出现 外部类 和 内部类各自的字节码class文件,
这就说明内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己的成员变量和方法。
并且方法的属性与内部类的生命周期不同. 方法执行完毕后,方法内的属性也会随之被销毁,然而如果让内部类在使用
被销毁的属性这并不合理. 解决方法就是加上final关键字.在java中, 某个属性一旦加上final关键字, 可以看作是常量,
而常量的生命周期在程序的整个执行期间
都是有效的. 所以可以引用, 不会出错.

点评

说到底,还是个生命周期的问题。  发表于 2014-8-12 11:14

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的不错!

查看全部评分

回复 使用道具 举报
因为方法中声明内部类,目的只是由外部类来控制内部类的可见性,将一个类放到一个方法当中去定义的时候,那么就限定了这个类的使用范围只能在方法的内部,这个内部类相对这个类就和以他方法和属性一样的。只是内部类的生命周期和这个类的属性生命周期是不同的。
        在内存中,类的属性会被分配到栈中的。当调用结束的时候就会退栈,也就是说在内存中这个属性就消失了。内部类也是类,只用在内存中对他的引用消失了才会死亡的内部类,这个时候内部类调用类中已经结束调用的属性是不可能的。也就是说局部类的生命周期超过了类的局部变量。解决的办法就是在局部变量前加上final。
[ 本帖最后由 廖乃波 于 2011-09-02  20:26 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 为什么加final就可以啊?

查看全部评分

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