Thinking Java 原话:
如果你在定义匿名内部类的时候,还要用到外面的对像,那编译就会要求你把这个参数的引用声明成final的.但我测试时发现如下问题,代码如下:public class Parcel8
{
String u = "this is test ;  //这里不是final,匿名内部类里也能调用.
public Destination dest(final String dest)
{
final int i = 90; //这里如果不设置成final就会出错.
return new Destination()
{
private String label = dest;
public String readLabel()
{
System.out.println(u + i); 
return label; 
}
//public void test() { System.out.println(i); }
};
}请问.为什么String u 不是fianl在匿名内部类中也能调用? 谢谢.

解决方案 »

  1.   

    我把String u = "this is test ; 改成 int i = 100; 也是这样.
      

  2.   

    首先确定一下String u是成员变量
    而final int i是局部变量事实上内部类保存了一个他外面的类的引用
    而且只要这个内部类存在,那么他外面的类就一定存在
    使用这个引用可以很容易定位到外面这个类的成员变量
    所以没有必要非得使用final而局部变量则不同
    局部变量一般存在于函数里面
    我们知道函数运行是有一定时间的,
    也就是说当函数运行完毕之后,函数里面的局部变量就不存在了
    这时候内部类如果去访问呢?
    其实内部类是保存了一个外面的局部变量的备分
    这样当函数运行完毕之后,内部类还是可以访问那个局部变量
    可是问题又来了,我们知道变量的值是可以变的,
    也就是说变量在不同的时间会有一些不同的值
    那么内部类保存哪个值呢??
    为了解决这个问题,所以一定要用final使这个变量的值不变楼主明白了吗?
      

  3.   

    Thinking Java 原话:
    如果你在定义匿名内部类的时候,还要用到外面的对像,那编译就会要求你把这个参数的引用声明成final的.因为我现在手头上没有这本书,所以就猜一下。
    因为匿名内部类一定是定义在方法里面的,所以这里说的外面的对象是指外面的局部变量,而不是指成员变量。