方法参数中的最终关键字

我经常遇到如下的方法:

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

如果调用此方法而不传递最终参数会发生什么情况。 即稍后改变的Object1(所以没有声明为final)可以传递给这个方法

Java在将它们发送给方法之前总是先制作一个参数的副本。 这意味着最后的调用代码并不意味着任何区别。 这只意味着在方法内variables不能被重新分配。 (注意,如果你有最终的对象,你仍然可以改变对象的属性)。

有一种情况需要最终声明它 – 否则会导致编译错误,即将它们传递给匿名类。 基本示例:

 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修饰符会导致编译错误,因为不能保证该值是运行时常量。 从匿名类外部改变值将导致匿名类实例在创build之后performance不同。

Java只是传值。 (或更好的 – 按值传递参考)

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

因此,如果更改对象的状态 ,则会反映到引用它的每个其他variables。 但是,如果你重新分配一个新的对象(值)的参数,然后指向这个对象(值)的其他variables不会被重新分配。

方法参数的final关键字对调用者来说绝对没有任何意义。 对于正在运行的程序来说,这也意味着什么,因为它的存在与否不会改变字节码。 只有在参数variables在方法中被重新分配的情况下,它才能确保编译器会抱怨。 就这样。 但这就够了。

有些程序员(像我)认为这是一件非常好的事情,几乎每个参数都使用final 。 它使得理解一个漫长或复杂的方法变得容易(尽pipe人们可能会认为冗长而复杂的方法应该被重构)。这也使注明final方法参数成为焦点。

考虑这个foo()的实现:

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

因为Runnable实例会超出这个方法,所以如果没有final关键字就不会编译 – final告诉编译器可以安全地获取引用(稍后参考它)。 因此,它被认为是最终的,而不是价值 。 换句话说:作为一个来电者,你不能搞乱任何东西…

最后意味着你不能改变这个variables的值。

同时,在这些方法中使用final参数意味着它不会允许程序员在执行方法时改变它们的值 。 这只意味着在方法内部最后的variables不能被重新分配。

如果您将任何参数声明为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

@stuXnet,我可以做出完全相反的论点。 如果您将一个对象传递给一个函数,并且您更改了传递的对象的属性,那么该函数的调用者将在其variables中看到更改的值。 这意味着通过参考系统,而不是通过价值。

令人困惑的是在指针的使用完全隐藏到最终用户的系统中,按值传递或按引用传递的定义。

Java绝对不是通过价值传递的,因为这样,就意味着可以改变传递的对象,原来的东西不受影响。

注意,你不能改变基元,你只能将它们赋值给variables。 因此,通过引用或通过使用基元的值testingPass并不是testing。

在Java中可以用其他语言无法完成的事情是将调用者的variables重新分配给一个新的值,因为在Java中没有指针,所以这会让人感到困惑。

方法input参数中的final关键字是不需要的。 Java为对象创build一个引用的副本,因此把final放在最后不会使对象成为final,而只是引用,这是没有意义的

几乎所有的东西都是用Java final方法参数。 但我想添加一个小小的简单的事情,你可以想象这个final方法参数,像在C++ const传递引用参数,如=>

 void someMethod(const int* param1) { ... } 

string是不可改变的,所以你不能改变string(你只能使持有String对象的variables指向一个不同的String对象)。

但是,这不是你可以将任何variables绑定到final参数的原因。 所有的编译器检查都是在方法中不重新分配参数。 这对于文档目的来说是很好的,可以说是很好的风格,甚至可以帮助优化字节代码的速度(虽然这在实践中似乎没有太大的作用)。

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

  a = someObject(); process(a); 

a的字段可能已经改变了,但是a仍然是以前的同一个对象。 在传递参考语言中,这可能不是真的。