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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王--明 黑马帝   /  2012-2-26 20:17  /  1680 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类访问局部变量为什么要定义成final类型。求详解。

4 个回复

倒序浏览
因为局部变量是临时的,方法一旦执行完毕即被释放,而内部类是要在java虚拟机中动态运行的程序,它的生命周期不随方法的结束而结束,故而。。。
如下:
class   A
{
int i = 3;
public   void   shout()
{

class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout();
}
}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class   A
{
public   void   shout(int temp)
{
final int i = temp;
class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout(3);
}
}

如不是final变量, 当i发生变化, 类B实例不能找到新i变量的地址, 便会出现了歧义. 如不希望final, 可讲i定义为A的类成员变量

点评

谢谢了,明白了  发表于 2012-2-27 12:17

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 很给力!

查看全部评分

回复 使用道具 举报
通过网上文章学习得知,大抵解释如下:
      你说的内部类应该是局部内部类,它定义在外部类的成员方法中。
      在局部内部类中访问的  局部变量的值 ,其实是它在这个局部内部类中 临时定义的一个变量, 用 反射可以证明,(以后你会学到)。原因是因为局部变量使用了立即被释放,局部内部类直接访问可能访问不到。
      但是有一个问题就是这个临时变量 被赋给的是值,不是 对局部变量的引用,意味着不能随着局部变量的更改而相应的变动,那么如果你不把局部变量修饰为 final 类型,你使用完局部变量后给它重新赋值,就会出现局部内部类使用的变量值不是你所预期的,故将其定义为final ,顺应人们的逻辑。

不是很好理解,看详细附的文章。
回复 使用道具 举报
细附的文章为这个压缩包。

为什么从内部类中访问局部变量需要被声明为最终类型.rar

4.39 KB, 下载次数: 81

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马