方法参数中的 final 关键字

我经常遇到这样的方法:

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

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

191118 次浏览

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

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

因此,如果更改对象的 国家,它将反映到引用它的每个其他变量。但是,如果你重新分配一个新的对象(值)的参数,那么其他变量指向这个对象(值)不会得到重新分配。

Java 总是在将参数发送到方法之前制作一个参数副本。这意味着 final 对于调用代码没有任何差别。这只意味着方法内部的变量不能被重新分配。

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

考虑一下 foo ()的实现:

public void foo(final String a) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.print(a);
}
});
}

因为 Runnable实例会比方法存活的时间长,所以如果没有 final关键字,就不能进行编译—— final告诉编译器获取引用的副本是安全的(以后再引用它)。因此,参考文献被认为是最终的,而不是 价值。换句话说: 作为一个打电话的人,你不能搞砸任何事情..。

字符串是不可变的,所以实际上你不能改变字符串后(你只能使变量,举行字符串对象指向一个不同的字符串对象)。

但是,这并不是您可以将任何变量绑定到 final参数的原因。所有编译器检查的都是参数没有重新分配 内心方法。这有利于文档的编写,可以说是很好的风格,甚至可以帮助优化字节代码以提高速度(尽管在实践中这似乎没有多大作用)。

但是即使你在一个方法中重新分配了一个参数,调用者也不会注意到,因为 java 通过值来传递所有的参数。在序列之后

  a = someObject();
process(a);

A 的字段可能已经改变,但 a 仍然是原来的对象。在引用传递语言中,这可能是不正确的。

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

方法参数上的 final关键字对调用者来说完全没有意义。它对于正在运行的程序也没有任何意义,因为它的存在或者不存在都不会改变字节码。它只能确保如果在方法中重新分配参数变量,编译器将会抱怨。仅此而已。但这就够了。

一些程序员(比如我)认为这是一件非常好的事情,几乎在每个参数上都使用 final。它使理解一个长的或复杂的方法变得更加容易(尽管有人可能认为长的和复杂的方法应该被重构)它还着重介绍了用 final标记的 没有方法参数。

Final 意味着一旦赋值,就不能更改该变量的值。

同时,对这些方法中的参数使用 期末考试意味着 它不允许程序员在方法执行期间更改它们的值。 这仅仅意味着在方法内部不能重新分配 期末考试变量。

如果将任何参数声明为 final,则不能更改它的值。

class Bike11 {
int cube(final int n) {
n=n+2;//can't be changed as n is final
n*n*n;
}
public static void main(String args[]) {
Bike11 b=new Bike11();
b.cube(5);
}
}

输出: 编译时间错误

更多详情,请访问我的博客: http://javabyroopam.blogspot.com

不需要方法输入参数中的 final 关键字。Java 创建了对象引用的一个副本,所以在其上添加 final 不会使对象成为 final,而只是引用,这是没有意义的