方法参数中的最终关键字
我经常遇到如下的方法:
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仍然是以前的同一个对象。 在传递参考语言中,这可能不是真的。