finalfinal 对于常量来说意味着值不能改变例如 final int i=这个i的值永远都是但是对于变量来说又不一样只是标识这个引用不可被改变例如 final File f=new File(c:\\testtxt)那么这个f一定是不能被改变的如果f本身有方法修改其中的成员变量例如是否可读是允许修改的形象的比喻一个女子定义了一个final的老公这个老公的职业和收入都是允许改变的只是这个女人不会换老公而已
实例解释********
)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= ;i< ; i ){
Systemoutprintln(str i)
try {
Threadsleep() ;
} catch (InterruptedException e) {
eprintStackTrace()
}
}
}
})start() ;
}
}
程序首先定义了一个局部变量str当程序main方法执行完成后str的生命周期就结束了但是子线程还没有执行结束而且子线程要
使用main中的局部变量str这个时候就扩大了str的作用范围这个时候如果str没有被修饰为final类型而可以随便改变则会引起
极大的混乱因此java编译器要求所有的内部类访问的局部变量必须使用final修饰符修饰