我们有一个方法,其参数被定义为final,然后更改此参数的值(在该方法中)并返回它,因为我们将其作为final传递,所以它不应该被更改。
但事实并非如此。
请帮助我理解这一点!
public static void main(String[] args) {
EmployeeBean e1 = new EmployeeBean("1", "jitu");
System.out.println("object before set >>" + e1.getEmpName());
EmployeeBean newObj = x.changeFinalvalue(e1);
System.out.println("object after set >>" + newObj.getEmpName());
public EmployeeBean changeFinalvalue(final EmployeeBean x) {
x.setEmpName("Jeet");
return x;
}
输出: 设置后的对象>>jitu
设置后的对象>>Jeet//怀疑:它只能是“jitu”
最佳答案
您不会更改参数引用的对象(此处不允许)。相反,您正在更改对象的状态(此处允许)。
换句话说,当您将 e1 EmployeeBean 对象传递到方法中时,x 参数引用 e1 引用的同一个对象,并且在方法内, this 无法更改,因此您不能这样做:
public EmployeeBean changeFinalvalue(final EmployeeBean x) {
x = new EmployeeBean(); // changing the reference is not allowed!
return x;
}
但是你正在做的事情——改变对象的状态——是允许的。
据我所知,防止出现此类问题的唯一方法是对作为参数传入的对象进行深层复制,并处理复制/克隆对象。您还可以使 EmployeeBean 不可变,但这样它就不再是 Bean,不是吗?
编辑:我认为这个问题已经在这里被问过很多次了,经过一番搜索,我发现它当然已经被问过。请查看这些链接以获得对此的良好讨论。请注意,这是有关最终变量的普遍问题,无论它们是方法参数还是类字段:
java-final-keyword-for-variables
java-final-modifier
关于java - 按值传递给最终参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713611/