问题

这个问题在这里已有答案:

  • 为什么我要在Java中的方法参数上使用关键字"final"? 12个答案

我经常遇到如下所示的方法:

public void foo(final String a, final int[] b, final Object1 c){
}

如果在不传递最终参数的情况下调用此方法会发生什么。即稍后更改的Object1(因此未声明为final)可以很好地传递给此方法


#1 热门回答(138 赞)

在将参数发送到方法之前,Java总是复制参数。这意味着最终并不意味着调用代码有任何区别。这仅意味着在方法内部无法重新分配变量。 (请注意,如果你有最终对象,则仍可以更改对象的属性)。


#2 热门回答(73 赞)

有一种情况,你需要**来声明它最终 - 否则会导致编译错误 - 即将它们传递给匿名类。基本示例:

public FileFilter createFileExtensionFilter(final String extension) {
    FileFilter fileFilter = new FileFilter() {
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(extension);
        }
    };

    // What would happen when it's allowed to change extension here?
    // extension = "foo";

    return fileFilter;
}

删除final修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建之后表现不同。


#3 热门回答(47 赞)

Java只是按值传递。 (或更好 - 按值传递参考)

因此传递的参数和方法中的参数是指向同一对象(值)的两个不同的处理程序。

因此,如果更改对象的状态,它将反映到引用它的每个其他变量。但是,如果为参数重新分配新对象(值),则不会重新分配指向此对象(值)的其他变量。


原文链接