黑马程序员技术交流社区
标题: 关于局部内部类final [打印本页]
作者: 陨落″烟雨。 时间: 2014-3-7 15:08
标题: 关于局部内部类final
本帖最后由 何伟超 于 2014-3-8 15:07 编辑
关于局部内部类的问题,在函数内定义的类,函数中存在一个变量int num = 3;,局部内部类调用的时候就会报错,就一定要加final,按理说这个其实是固定格式,没有什么好追究的,但是我很想知道的是,这里报错的原因其实就是局部变量的生命周期短,而对象还存在堆中,所以调用对象中的方法存在局部变量的时候就会找不到!
说白了!我就想知道final把变量变成了常量后,是怎么加长它的生命周期的!!!!
先谢谢能回答我问题的人!!
作者: My_work 时间: 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访问局部变量 时,其实真正访问的是这个局部变量的"复制品"(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以 访问局部变量(其实访问的是"复制品"),给人的感觉:好像是局部变量的"生命期"延长了.
那么:核心的问题是:怎么才能使得:访问"复制品"与访问真正的原始的局部变量,其语义效果是一样的呢?
当变量是final时,若是基本数据类型,由于其值不变,因而:其复制品与原始的量是一样.语义效果相同.(若:不是final,就无法保证:复制品与原始变量保持一致了,因为:在方法中改的是原始变量,而局部内部类中改的是复制品)
当 变量是final时,若是引用类型,由于其引用值不变(即:永远指向同一个对象),因而:其复制品与原始的引用变量一样,永远指向同一个对象(由于是 final,从而保证:只能指向这个对象,再不能指向其它对象),达到:局部内部类中访问的复制品与方法代码中访问的原始对象,永远都是同一个即:语义效果是一样的.否则:当方法中改原始变量,而局部内部类中改复制品时,就无法保证:复制品与原始变量保持一致了(因此:它们原本就应该是同一个变量.)
作者: 陨落″烟雨。 时间: 2014-3-7 16:53
谢谢您的回答!我知道发final的重要性,我想知道它是怎么实现比局部变量生命周期长的。。。
作者: 陨落″烟雨。 时间: 2014-3-7 16:55
谢谢您的回答,让我了解到了复制这一概念,有点出入!
作者: 艮昕辶 时间: 2014-3-7 18:57
本帖最后由 艮昕辶 于 2014-3-7 18:59 编辑
class Test {
int AMethod()
{
final int x=1;
class Inner
{
x=2;
};
return 1;
}
}
我个人理解final有static属性,可能是错的我在编译的时候加了final也还是报错要不你试试
作者: syusikoku 时间: 2014-3-7 19:46
内部类访问局部变量时,局部变量需要被final修饰。
作者: yueyazhishang 时间: 2014-9-22 08:59
学习了。
作者: kid1943 时间: 2014-10-2 20:55
讲得太棒了之前也想过这问题 但没想明白
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |