猿问

方法参数中的final关键字

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


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

}

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


智慧大石
浏览 391回答 3
3回答

慕田峪9158850

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

森林海

在某些情况下,您需要将其声明为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修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建后表现不同。

杨魅力

考虑以下foo()的实现:public void foo(final String a) {    SwingUtilities.invokeLater(new Runnable() {        public void run() {            System.out.print(a);        }    }); }因为Runnable实例将超出方法的寿命,所以没有final关键字就无法编译- final告诉编译器可以安全地复制引用(以后再引用)。因此,将参考视为最终参考,而不是value。换句话说:作为呼叫者,您无法搞乱任何事情...
随时随地看视频慕课网APP

相关分类

Java
我要回答