方法参数中的 final 关键字

2022-08-31 06:53:57

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

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

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


答案 1

Java 总是在将参数发送到方法之前复制参数。这意味着最终并不意味着调用代码有任何区别。这仅意味着在方法内部不能重新赋值变量。

请注意,如果您有最终对象,您仍然可以更改该对象的属性。这是因为 Java 中的对象实际上是指向对象的指针。并且只复制指针(并且在您的方法中将是最终的),而不是实际的对象。


答案 2

在某些情况下,您需要将其声明为 final -- 否则将导致编译错误--,即将它们传递到匿名类中。基本示例:

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


推荐