1.finalfinal 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c: est.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。形象的比喻:一个女子定义了一个final的老公,这个老公的职业和收入都是允许改变的,只是这个女人不会换老公而已。
实例解释********
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修饰符修饰