黑马程序员技术交流社区

标题: 关于局部内部类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
zengming13 发表于 2014-3-7 15:39
内部类访问外部变量,编译器会在内部类中定义一个和外部变量完全相同的变量。为什么要这么做呢?
1.当内部 ...

谢谢您的回答!我知道发final的重要性,我想知道它是怎么实现比局部变量生命周期长的。。。
作者: 陨落″烟雨。    时间: 2014-3-7 16:55
My_work 发表于 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访 ...

谢谢您的回答,让我了解到了复制这一概念,有点出入!
作者: 艮昕辶    时间: 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
My_work 发表于 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访 ...

学习了。
作者: kid1943    时间: 2014-10-2 20:55
My_work 发表于 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访 ...

讲得太棒了之前也想过这问题 但没想明白




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