分类: Java
2011-12-08 10:04:02
3)final变量在内部类中的使用
程序需要在匿名内部类中使用局部变量,则局部变量必须声明为final类型。否则会编译错误。为什么必须声明为final类型呢?这是应为
对于普通变量而言,它的作用域是停留在该方法内,当方法执行结束,该局部变量也就随之消失,但内部类则可能产生隐式的“闭包”,
闭包使得局部变量脱离它所在的方法继续存在。
看下面的例子:
public class ClosureTest {
public static void main(String[] args) {
final String str = "java" ;//定义局部变量
new Thread(new Runnable(){
public void run(){
for(int i=0 ;i<100 ; i ){
System.out.println(str i);
try {
Thread.sleep(100) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start() ;
}
}
程序首先定义了一个局部变量str,当程序main方法执行完成后,str的生命周期就结束了,但是子线程还没有执行结束,而且子线程要
使用main中的局部变量str,这个时候就扩大了str的作用范围。这个时候如果str没有被修饰为final类型,而可以随便改变,则会引起
极大的混乱,因此java编译器要求所有的内部类访问的局部变量必须使用final修饰符修饰