Java 代码块中最终变量的差异

Java 代码块中最终变量的差异,java,Java,我看到一些代码,比如 public void foo() { final int x = 3; final Object z = new Object(); ....... } 我知道x不能修改,因为它是最终的,但是有其他原因/解释吗?与不使用final的情况相比?或者开发人员只是将final添加到该变量中,因为他喜欢这样做。谢谢。1最后一节课不能延长 2不能重写最终方法 3最终字段、参数和局部变量在设置后不能更改其值 4将原语字段声明为final将自动确保该字段的线程

我看到一些代码,比如

public void foo() {
    final int x = 3;
    final Object z = new Object();
    .......
}

我知道x不能修改,因为它是最终的,但是有其他原因/解释吗?与不使用final的情况相比?或者开发人员只是将final添加到该变量中,因为他喜欢这样做。谢谢。

1最后一节课不能延长

2不能重写最终方法

3最终字段、参数和局部变量在设置后不能更改其值

4将原语字段声明为final将自动确保该字段的线程安全

5清楚地传达你的意图

6允许编译器和虚拟机执行较小的优化


7明确标记行为更简单的项目-final说,如果你在寻找复杂性,你在这里找不到。

不,除了不让其他人更改值对象、原语之外,没有其他原因,但这并不阻止他们更改类中的值,例如,final Dog Dog=新Dog将阻止其他人更改对Dog对象的引用,但不会阻止我们更改其中的变量,例如,Dog的大小值声明变量immutable final本身就是一个很好的理由。除了增加代码的清晰度外,它还为编译器提供了一些有价值的信息,当编译器知道某些事情不会改变时,这些信息可能能够更好地优化代码

另一个原因可能隐藏在省略号后面的示例中:如果该函数中某处存在引用此局部变量的闭包,则如果它们不是最终变量,则不会编译。想象一下,例如:

public void foo() {
    final int x = 3;
    final Object z = new Object();
    new Thread() {
        public void run() {
            for(int i = 0; i < x; i++) {
                System.out.println(z);
            }
        }
    }.start();
}

要使其起作用,必须将x和z声明为最终值。为什么?局部变量是在堆栈上创建的,一旦函数返回,它们就会完全消失。但是这里定义的Thread.run方法中的代码可能在创建它的函数返回后仍在执行。因为变量是最终的,所以JVM在创建闭包时就知道它们的值,所以它可以简单地将值复制到闭包中。如果它们不是最终版本,就不可能了,因为一旦原始值被修改,副本就会过时。

你的意思是什么?还有其他原因吗?你能澄清你的问题吗?原始海报看到这个答案了吗?是的,我读了这个,除了这个,我还想要更多。非常感谢你的回答。谢谢你的解释。