首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法参数中的final关键字

方法参数中的final关键字
EN

Stack Overflow用户
提问于 2010-02-10 20:05:21
回答 9查看 170.5K关注 0票数 165

我经常遇到类似如下的方法:

代码语言:javascript
复制
public void foo(final String a, final int[] b, final Object1 c){
}

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-02-10 20:08:28

Java总是在将参数发送给方法之前对其进行复制。这意味着对于调用代码来说,最终结果并没有什么不同。这只意味着在方法中变量不能被重新赋值。

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

票数 215
EN

Stack Overflow用户

发布于 2010-02-10 20:16:46

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

代码语言:javascript
复制
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修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改该值将导致匿名类实例在创建后的行为有所不同。

票数 93
EN

Stack Overflow用户

发布于 2010-02-10 20:08:02

Java只是按值传递的。(或者更好的-通过值传递引用)

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

因此,如果您更改对象的状态,它会反映到引用它的所有其他变量。但是,如果将新对象(值)重新赋值给参数,则指向此对象(值)的其他变量不会被重新赋值。

票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2236599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档