答案 0 :(得分:22)
使用“final”关键字使您声明为不可变的变量。初始分配后,无法重新分配。
但是,这并不一定意味着变量引用的实例的状态是不可变的,只是引用本身。
有几个原因可以在变量上使用“final”关键字。一种是优化,通过将变量声明为final,允许值为memoized。
另一种使用final变量的场景是方法中的内部类需要在声明方法中访问变量。以下代码说明了这一点:
public void foo() {
final int x = 1;
new Runnable() {
@Override
public void run() {
int i = x;
}
};
}
如果x未声明为“final”,则代码将导致编译错误。需要成为“最终”的确切原因是因为新的类实例可以比方法调用更长,因此需要它自己的x实例。为了避免在同一范围内拥有多个可变变量副本,必须将变量声明为final,以便不能更改。
一些程序员还提倡使用“final”来防止意外重新分配变量。排序“最佳实践”类型规则。
答案 1 :(得分:7)
使用final来防止意外更改它:
public String foo(int a) {
final String s;
switch(a) {
case 0:
s="zero";
break;
case 1:
s="one";
//forgot break;
default:
s="some number";
}
return s;
}
这将无法编译,因为如果a == 1,s将被分配两次,因为缺少中断。最终可以帮助讨厌转换语句。
答案 2 :(得分:6)
无法重新分配最终变量。如果它们是类或实例范围,则必须在构造对象时分配它们。一个用途:你不希望任何其他人使用你改变的常数,例如: string或int常量(虽然枚举在1.5+中做得更好)。此外,如果要从您在该方法中定义的匿名方法引用方法范围变量,它必须是最终的,因此Java不必处理如果您的代码稍后在创建之后重新分配该变量会发生什么内部匿名方法的本地堆栈框架/范围。有人谈到在Java 7中包含某种形式的闭包可能会避免这种限制。
我可能对术语有点拙劣 - 抱歉!但这是一般的想法。
答案 3 :(得分:3)
它声明了一个初始化后无法修改的变量。排序只读。