我们有一个方法,其参数定义为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'
答案 0 :(得分:2)
您没有更改参数引用的对象(此处不允许)。相反,您正在更改对象的状态(此处允许 )。
换句话说,当您将e1 EmployeeBean对象传递给方法时,x参数引用e1引用的同一对象,并且在方法中,这不能更改,因此您不能这样做:< / p>
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
答案 1 :(得分:1)
这样做的原因是因为'final'只能确保参数值不会改变。在这种情况下,这意味着对对象的引用。对象的字段仍然可以改变。
所有其他最终变量也是如此。
答案 2 :(得分:0)
方法的参数声明部分中的final
关键字意味着您无法在方法内重新分配(例如,x = new EmployeeBean();
)。但很明显,你可以更改其属性,并且因为该方法接收对该对象的引用,所以在方法返回其调用者之后,对方法内对象状态所做的任何更改都将占上风。
确保不会被修改的唯一方法是将其设为immutable,但当然是否可以使特定对象不可变取决于手头的问题。