今天在搜索谷歌的某段代码时,我遇到了一个Q / A博客,据说我们可以在一个类的方法中声明一个局部变量为final。然而,作者不愿意解释这样做的必要性/好处。
喜欢
public class A
{
private void show()
{
final String s="checking";
}
}
我会寻求java专家的帮助来教育我。在此先感谢您的支持和指导。
祝你好运!
答案 0 :(得分:8)
除了其他答案之外,创建变量final
还可以在类和接口的内联实现中使用该变量:
final String test = "test";
foo = new Foo() {
public void bar() {
System.out.println(test);
}
};
编辑:
如果您是初学者,也可能值得指出变量实际上是实例的引用。当你创建一个变量final
时,你实际上正在使引用常量,也就是说,最终变量在初始化之后永远不会引用其他实例。这并未声明实际引用的实例是否为常量。
例如,如果您说final String[] foo = { "bar", baz" }
即使foo[0] = "sheep"
为foo
, 也可以<{1}} final
。您不能做的是将foo
变量引用到其他内容,例如foo = new String[]...
或foo = someOtherArray
。这与可变性和不变性有关,而这些概念有点类似于final
,所以它们可能值得一些调查。
答案 1 :(得分:4)
变量可以放在只读存储器中,使其操作更快。
这样做也是合乎逻辑的,例如表示局部常量或确保不会意外更改某个值。这使它成为将错误转换为编译器错误的有用方法。
此外,它允许变量在内部/匿名类中使用,如其他答案所指出的那样。
答案 2 :(得分:4)
除了强制变量在初始化后保持不变之外,将变量声明为final
使得方法本地内部类可以访问它。
通过查看以下一小段代码的反汇编代码,可以获得更详细的信息:
class MyFinal
{
public static void main(String[] args)
{
String str = "java";
final String str1 = "Hello";
}
}
上述程序的反汇编代码如下:
J:\>javap -c MyFinal
Compiled from "MyFinal.java"
class MyFinal extends java.lang.Object{
MyFinal();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String java
2: astore_1
3: return
}
在上面反汇编代码的main方法中,我们看到,java编译器保留了non-final
变量str
的String对象创建代码,但是它默认地省略了{{1}的String对象创建代码。 1}}。这是因为,final String str1 = "Hello";
在任何地方都没有使用。因此,它有助于编译器优化代码,如果不使用它,可以避免不必要的对象创建。
答案 3 :(得分:2)
能够轻易地告诉变量不会改变是有意义的。如果这是一个原语,你可以认为该值是不可变的,如果不是,你现在知道该值将始终是同一个实例(可以更改哪个状态)。
这对程序的可读性很有用,这样我们就可以确保永远不会重新赋值变量。它对于匿名函数也很有用,在此解释:Why do we use final keyword with anonymous inner classes?
答案 4 :(得分:1)
将
final
添加到不应该更改的所有内容中,只会缩小您(或下一个程序员,处理您的代码)会误解或误用导致的思维过程的可能性在你的代码中。
从this answer转到类似的问题。
答案 5 :(得分:0)
当var为final时,您无法更改它。这意味着 - 一个你不能做的错误 - 或者,如果更确切地说,一个逻辑错误会产生编译错误,并节省长时间的调试。
不要与您无法继承的final class
混淆。