为了账号安全,请及时绑定邮箱和手机立即绑定

方法参数中的final关键字

方法参数中的final关键字

智慧大石 2019-11-13 09:41:05
我经常遇到如下所示的方法:public void foo(final String a, final int[] b, final Object1 c){}如果在未传递最终参数的情况下调用此方法会发生什么。即,可以将稍后更改的Object1(因此未声明为final)传递给此方法
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-11-13
?
森林海

TA贡献2011条经验 获得超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修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建后表现不同。


查看完整回答
反对 回复 2019-11-13
?
杨魅力

TA贡献1811条经验 获得超6个赞

考虑以下foo()的实现:


public void foo(final String a) {

    SwingUtilities.invokeLater(new Runnable() {

        public void run() {

            System.out.print(a);

        }

    }); 

}

因为Runnable实例将超出方法的寿命,所以没有final关键字就无法编译- final告诉编译器可以安全地复制引用(以后再引用)。因此,将参考视为最终参考,而不是value。换句话说:作为呼叫者,您无法搞乱任何事情...


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 390 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信