我想知道是否有使用最终局部变量的可用性。当继承进入图像时,无论如何都不会覆盖变量。例如,下面的简单代码
public static void main(String args[]) {
final String data = "Hello World!";
System.out.println(data);
}
示例非常简单,可能不是相关的代码,但问题更通用。我看过很多代码(所有代码都包含在main函数中,它们都有最终的局部变量)是否有任何声明局部变量的可用性除了它们之外,它们不能在同一个函数中编辑?
答案 0 :(得分:59)
首先,关于变量“被覆盖”的部分 - final
有两个截然不同的含义。对于类和方法,它是关于继承;对于变量,它是关于只读的。
最终局部变量有一个重要的“特征”:它们可以在本地(通常是匿名的)内部类中使用。非最终的局部变量不能。根据我的经验,这是final
对局部变量的主要用途。
public void foo() {
final String x = "hello";
String y = "there";
Runnable runnable = new Runnable() {
@Override public void run() {
System.out.println(x); // This is valid
System.out.println(y); // This is not
}
};
runnable.run();
}
请注意,作为一种风格,有些人喜欢使用final
,即使他们不在本地内部类中捕获变量。我肯定会对final
作为默认值感到满意,但对于“非最终版”却是一个不同的修饰符,但我发现在任何地方明确添加修饰符太过分散注意力。
答案 1 :(得分:9)
最终局部变量可以从匿名内部子类访问,而非最终局部变量可能不会。
答案 2 :(得分:8)
是的,可用性是: - 本地最终变量可由方法内部类访问。 由于局部变量存在于堆栈中并且仅在方法的生命周期中存在,但是内部类对象可能寿命更长,因此内部类不能访问任何非最终局部变量。 但是一旦变量是final,那么内部类确保该值不会改变,因此它保留了最终局部变量的私有副本以供使用。
答案 3 :(得分:5)
是的,有一个小例子,我们通常可以使用它 -
<强>段强>:
final Boolean data = Boolean.TRUE;
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (data ) {
....
}
}
});
它是匿名内部类的一个使用示例。如果你想在内部calss中使用你的局部变量,你必须使final
。
答案 4 :(得分:5)
完美答案Jon Skeet但是最终变量还有另外一点好处。
编译器将确保最终变量只设置一次。
假设你必须初始化一个变量并且值的计算是复杂的(在if-then-else中多个if-then-else)。您可能编写的代码在某些条件下不会初始化变量(或将其初始化两次)。当然,这是一个错误。使变量final将允许编译器检查最终变量是否只设置一次。如果你有错误,你会很快知道。
正如我所说,收效甚微,但仍然很方便。
答案 5 :(得分:4)
在java中使用最终局部变量
final
字段,参数和局部变量是只读(表示对象的标识,而不是其状态)。
答案 6 :(得分:3)
您可以使用final
关键字来提高可读性并确保它不被修改,或者使用匿名类,例如:
final String s = "hi";
new Thread(new Runnable() {
@Override
public void run() {
// can use s variable here
}
}).start();
答案 7 :(得分:3)
它告诉其他程序员,无论谁编写它都知道 data 的值一旦分配就不会改变。在我看来,这是一个很好的习惯,特别是将参数变量声明为 final 。