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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肥洋洋 中级黑马   /  2014-6-28 15:09  /  1892 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 肥洋洋 于 2014-6-28 17:57 编辑

局部内部类访问局部变量,局部变量为什么要加final呢??给个详细点的回答谢谢

7 个回复

倒序浏览
  1. final可以修饰类  变量   和函数,
  2. 被final修饰过得类  不可继承
  3. 被final修饰过得函数,不可复写
  4. 被final修过过得变量就变成常量,一旦被赋值,将不可修改
  5. final int x=3;  //x就终生为3
  6. x =4; //编译就会失败
复制代码


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
在内部类中访问局部变量,编译器实际上会为该内部类创建一个成员变量,以及带有参数的构造方法,然后将该变量传入构造方法,也就是说外面的变量和类里面的变量就是名字相同而已,此时你无论修改哪一个都对另外一个不产生影响,这样就出现矛盾了,防止这种现象就规定只准用final
你可以自己定义构造方法然后传进去,就没必要定义final变量
成员变量的话实际上内部类访问就是用类似于Test.this.xxx的形式访问跟类信息或者对象信息有关的,修改哪一个都会造成变量值的修改,就不存在上面的那种矛盾了

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈云阳 于 2014-6-28 16:06 编辑

这是java中的一个规定,因为局部方法,跟局部内部类生命周期不一样,当你调用函数时,函数里创建了局部内部类对象,访问局部成员,当局部方法调用结束后,局部内部类对象还可能不会消失,如果没人再引用他才会消失,而局部内部类对象还访问着局部变量,可是局部变量已经消失啦,所以会产生错误,而被final修饰过得局部变量,会在函数结束后,自我复制一份在其他地方被该局部内部类访问
回复 使用道具 举报
因为局部内部类,与局部变量的的生命周期不同,比如内部类Inner的对象方法function(),它里面调用了一个局部变量x,而这个方法结束后,这个局部变量x就不存在了,可是这个局部内部类对象却还可能存在(没有人调用时,它才会消失)。不会随着方法function()的结束而消失,所以这时就可能出现这个内部类对象访问一个不存在的局部变量,这时用final来修饰,可以理解为延长了局部变量的生命周期(final将局部变量复制了一份,当局部变量死亡时,它可以继续访问局部变量的复制品....)
  1. class Outer{
  2. void method(){
  3. int x=3;
  4. class Inner{ //内部类

  5. void function(){
  6. System.out.println("inner:"+x);
  7. }
  8. }
  9. }
  10. }
复制代码




回复 使用道具 举报
燿陚√揚葳 发表于 2014-6-28 16:21
因为局部内部类,与局部变量的的生命周期不同,比如内部类Inner的对象方法function(),它里面调用了一个局部 ...

final是把局部变量变成常量存储在常量池中吧,不是复制吧?
回复 使用道具 举报
肥洋洋 发表于 2014-6-28 17:57
final是把局部变量变成常量存储在常量池中吧,不是复制吧?

嗯嗯,是的原来的变量不在了,常量池中的不就像是他的复制体吗?原来的和常量池的变量
回复 使用道具 举报
都是大牛,表示无力
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马