5

Today while searching for a certain piece of code from google, I came across one Q/A blog, where its been said that we can declare a local variable inside a method of a class to be final. However, the author was reluctant enough to explain the need/ benefit of doing so.

like

public class A
{
 private void show()
 {
  final String s="checking";
 }
}

I would seek java gurus' help to educate me on this. Thanks in advance for your kind support and guidance.

Best regards!

4

6 回答 6

8

除了其他答案之外,创建变量还final可以在类和接口的内联实现中使用该变量:

final String test = "test";

foo = new Foo() {
        public void bar() {
            System.out.println(test);
        }
    };

编辑:如果您是初学者,还可能值得指出该变量实际上是对instance的引用。当你创建一个变量时,你实际上是在创建引用常量,也就是说,一个最终变量在初始化后永远不能引用其他实例。这没有声明实际引用的实例是否是常量。final

例如,如果您说即使isfinal String[] foo = { "bar", baz" }可以。你不能做的是将变量引用到其他东西,比如 in or 。这与可变性不变性有关,这些概念有点类似于,因此它们可能值得研究。foo[0] = "sheep"foofinalfoofoo = new String[]...foo = someOtherArrayfinal

于 2013-07-29T18:31:59.913 回答
4

该变量可以放在只读存储器中,使其操作起来更快。

这样做也很合乎逻辑,例如用于表示局部常量或确保某个值不会被意外更改。这使它成为将错误转化为编译器错误的有用方法。

此外,正如其他答案所指出的那样,它允许在内部/匿名类中使用变量。

于 2013-07-29T18:27:16.717 回答
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编译器保留了String对象创建non-final变量的代码,str却默默地省略了String对象的创建代码 final String str1 = "Hello";。之所以如此,str1是因为在任何地方都没有使用该方法。因此,它有助于编译器优化代码,从而避免在不使用它的情况下创建不必要的对象。

于 2013-07-29T18:30:16.150 回答
2

能够轻松判断变量不会改变是有道理的。如果这是一个原语,您可以认为该值是不可变的,如果不是,您现在知道该值将始终是同一个实例(可以更改哪个状态)。

这对于程序的可读性很有用,因此我们可以确定变量永远不会被重新分配。它对匿名函数也很有用,在这里解释:为什么我们在匿名内部类中使用 final 关键字?

于 2013-07-29T19:41:54.013 回答
1

添加final所有不应更改的内容只会缩小您(或下一个程序员,正在处理您的代码)误解或滥用导致您的代码的思维过程的可能性。

取自this answer to a similar question。

于 2013-07-29T18:27:23.050 回答
0

当一个 var 是 final 时,你不能改变它。这意味着 - 一个你不能犯的错误 - 或者,更准确地说,一个逻辑错误会导致编译错误,并节省长时间的调试。


不要与final class你不能继承的东西混淆。


更多数据可以在维基百科中找到

于 2013-07-29T18:26:36.473 回答