java的final修饰符

修饰变量
TIJ中写到
1 可以是永远不变的 编译期常量
2 必须在执行期初始化
这样如果申明的final的变量 没有赋值
那么在执行期间就会初始化成可变的 但是一但初始化 就不可变
 final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误

修饰引数
那么传进来的参数是不可能被赋予其他的引用
TIJ里的例子
public class FinalArgument{
void with(final Gizmo g){
//g = new Gizmo() ; 这是非法的
}
void without(Gizmo g){
g = new Gizmo() ;//这是合法的
}
//这样也不行 不能改变其值
void f(final int i){i++;}//不能改变
//这样是可以的
int g(final int i){return i++;}
}

修饰方法
1 在继承过程中保持不变 无法复写
2 影响执行的效率 会降低函数调用动作的额外负担 具体查看TIJ的重复运用classes章节
3 所有的private方法都自然是final的