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在匿名内部类中也能调用? 谢谢.
如果你在定义匿名内部类的时候,还要用到外面的对像,那编译就会要求你把这个参数的引用声明成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在匿名内部类中也能调用? 谢谢.
解决方案 »
- 请教一个很简单的正则表达式问题
- 拜求一个统计的SQL(二)
- A xx = new B()是不是说明: A必是B的你类!?
- 一个简单的纵向循环数据变横向循环数据的问题
- 学JAVA的困惑(在线等)
- java里有什么方法可以向任意指定的IP发数据包
- List<Article> articles = new ArrayList<Article>();出错怎么解决?
- 我用JTree构造了一个树型列表,如何使初始化时,缺省选中某一个节点.
- 简单问题-如何让jdk编译后将*.class文件存放在指定文件夹
- 这是什么错误???HELP!!!
- 一个小问题,请各位大侠帮忙
- 帮帮忙!在线等!!!!!初步,一个很简单的问题!
而final int i是局部变量事实上内部类保存了一个他外面的类的引用
而且只要这个内部类存在,那么他外面的类就一定存在
使用这个引用可以很容易定位到外面这个类的成员变量
所以没有必要非得使用final而局部变量则不同
局部变量一般存在于函数里面
我们知道函数运行是有一定时间的,
也就是说当函数运行完毕之后,函数里面的局部变量就不存在了
这时候内部类如果去访问呢?
其实内部类是保存了一个外面的局部变量的备分
这样当函数运行完毕之后,内部类还是可以访问那个局部变量
可是问题又来了,我们知道变量的值是可以变的,
也就是说变量在不同的时间会有一些不同的值
那么内部类保存哪个值呢??
为了解决这个问题,所以一定要用final使这个变量的值不变楼主明白了吗?
如果你在定义匿名内部类的时候,还要用到外面的对像,那编译就会要求你把这个参数的引用声明成final的.因为我现在手头上没有这本书,所以就猜一下。
因为匿名内部类一定是定义在方法里面的,所以这里说的外面的对象是指外面的局部变量,而不是指成员变量。