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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© OnlyStyle 中级黑马   /  2014-10-31 22:44  /  1102 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道,当定义在方法上的内部类访问方法的局部变量时,被访问的变量需要用final修饰,一直好奇为什么要这样?有人能解答么?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

4 个回复

倒序浏览
被final修饰的变量就是常量了。
如果代码是这样
  1. final int num=3;
  2. System.out.println("num="+num);
复制代码

就相当于直接把
  1. System.out.println("num="+num);
复制代码
中的num直接替换为3
System.out.println("num="+3);
回复 使用道具 举报
因为,内部类也是一个类,存在于堆内存中,只有当该类的引用消失后,内部类才会消失。
而局部变量存在与栈内存中,当调用结束后,即从内从中释放该属性。
所以内部类的生命周期大于局部变量的生命周期。内部类访问的话,可能会访问到已经消失的局部变量。
只有局部变量定义用final修饰后,局部变量存在于栈内存中,生命周期和工程的生命周期一样。内部类就可以访问了。
额,,,不知道理解的是否正确
回复 使用道具 举报
方法中的内部类能不能访问方法中的局部变量,为什么?(这时一道基础面试题)
方法中的内部类与方法中的局部变量的生命周期不同。
内部类也是一个类,在内存中是存储在堆中的,也只有当该类的引用消失时,内部类的生命周期才会结束。
但是方法中的局部变量在方法调用结束,就结束了。内部类的生命周期超过局部变量,
内部类无法调用可能消失的属性,所以无法访问。
解决方案:在局部变量前加修饰符final,此时局部变量的生命周期就足以让内部类访问了。
回复 使用道具 举报
加final是为了解决生命周期问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马