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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陨落″烟雨。 中级黑马   /  2014-3-7 15:08  /  2101 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何伟超 于 2014-3-8 15:07 编辑



       关于局部内部类的问题,在函数内定义的类,函数中存在一个变量int num = 3;,局部内部类调用的时候就会报错,就一定要加final,按理说这个其实是固定格式,没有什么好追究的,但是我很想知道的是,这里报错的原因其实就是局部变量的生命周期短,而对象还存在堆中,所以调用对象中的方法存在局部变量的时候就会找不到!
      说白了!我就想知道final把变量变成了常量后,是怎么加长它的生命周期的!!!!
      先谢谢能回答我问题的人!!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

7 个回复

倒序浏览
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访问局部变量 时,其实真正访问的是这个局部变量的"复制品"(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以 访问局部变量(其实访问的是"复制品"),给人的感觉:好像是局部变量的"生命期"延长了.

那么:核心的问题是:怎么才能使得:访问"复制品"与访问真正的原始的局部变量,其语义效果是一样的呢?
当变量是final时,若是基本数据类型,由于其值不变,因而:其复制品与原始的量是一样.语义效果相同.(若:不是final,就无法保证:复制品与原始变量保持一致了,因为:在方法中改的是原始变量,而局部内部类中改的是复制品)

当 变量是final时,若是引用类型,由于其引用值不变(即:永远指向同一个对象),因而:其复制品与原始的引用变量一样,永远指向同一个对象(由于是 final,从而保证:只能指向这个对象,再不能指向其它对象),达到:局部内部类中访问的复制品与方法代码中访问的原始对象,永远都是同一个即:语义效果是一样的.否则:当方法中改原始变量,而局部内部类中改复制品时,就无法保证:复制品与原始变量保持一致了(因此:它们原本就应该是同一个变量.)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
zengming13 发表于 2014-3-7 15:39
内部类访问外部变量,编译器会在内部类中定义一个和外部变量完全相同的变量。为什么要这么做呢?
1.当内部 ...

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

谢谢您的回答,让我了解到了复制这一概念,有点出入!
回复 使用道具 举报
本帖最后由 艮昕辶 于 2014-3-7 18:59 编辑

class Test {
        int AMethod()
        {
                final int x=1;
                class Inner
                {
                        x=2;
                        
                };
                return 1;
        }
        
}

我个人理解final有static属性,可能是错的我在编译的时候加了final也还是报错要不你试试
回复 使用道具 举报
内部类访问局部变量时,局部变量需要被final修饰。
回复 使用道具 举报
My_work 发表于 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访 ...

学习了。
回复 使用道具 举报
My_work 发表于 2014-3-7 15:42
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访 ...

讲得太棒了之前也想过这问题 但没想明白
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马