黑马程序员技术交流社区

标题: 关于局部内部类访问局部变量的问题 [打印本页]

作者: 喻尚健    时间: 2011-12-2 11:01
标题: 关于局部内部类访问局部变量的问题
本帖最后由 喻尚健 于 2011-12-2 15:42 编辑

网上的解释是局部类访问局部变量时实际是将局部变量的参数传入内部类的构造函数中,因此内部类调用的实际上并不是方法中的局部变量,而是相当于局部变量的一个拷贝,
加final是为了保证内部类无法修改局部变量,确保一致性。。。这种说法是否正确呢?

作者: 颜秉武    时间: 2011-12-2 11:27
这种说法是正确的,虽然我不懂楼主所说的局部内部类什么意思?
局部变量其实是在它的父级函数或对象被调用时,它就跟着在栈内存中创建,而后凡是使用它,使用的其实都是它的地址,说copy也可以吧!
而当方法中的内部类访问方法中的局部变量时, 这个变量必须被final修饰,因为生命周期的不同,在方法中定义的局部变量在方法运行结束之后生命周期结束,不能再被访问。方法中的内部类创建的对象有可能生命周期比这个局部变量长,例如这个对象被作为返回值返回,那么方法运行结束之后还可以访问这个对象。这时变量被销毁了,对象还在,如果在对象的某个方法内访问这个变量就访问不到了。我们需要使用final修饰这个变量,被final修饰的变量会一直存储在内存中,方法运行结束之后不被销毁。
而final局部变量就是将变量最终话,这样变量的生命周期就不会低于方法中的内部类了,并且final修饰的局部变量也不能被修改了
作者: 刘海涛    时间: 2011-12-2 12:12

说法是正确的。
1.作用域的问题,就好像方法外面做的事情并不能改变方法内才定义的变量,因为你并不知道方法里面这个时候已经存在了这个局部变量了没有。在这个内部类中方法里面的本地变量是失效的,也就是不在作用域内,所以是不能够访问的
2.Java采用了一种copy   local   variable的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以access   local   variable的假象,而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生

假设局部变量不修饰为final:
    在多线程方面也有些影响,首先应该知道方法结束,方法内部的局部变量就会消失释放资源,如果方法内部类开启新的线程,引用了该方法内部局部变量,方法结束线程还在继续,就会导致线程无法获取引用的变量继续运行。
作者: 喻尚健    时间: 2011-12-2 15:41
学习了!谢谢
作者: 许邦存    时间: 2011-12-2 18:36
好像楼上说的有点深奥了,我理解的不够深,但我认为不管是内部类还是其他的外部类访问其他变量是都应该是引用,为了安全性加上final,如同一般类的final应该是一样的道理




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