java - 按值传递给最终参数

标签 java core

我们有一个方法,其参数被定义为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/

相关文章:

java - 引发异常 [com.mysql.jdbc.CommunicationsException : Communications link failure due to underlying exception:

java - 带有 spring 缓存和 aspectj 的 NoClassDefFoundError

Java 程序在 6 小时内崩溃,核心转储错误

linux - 使用来自不同系统的 GDB 分析核心转储会给出 .dynamic 部分警告

java - 旋转两条平行线以创建 X

java - 将对象添加到 Arraylist 并在方法外部使用它

java - hibernate 5.2.2(实体注释)+ mysql,eclipse上的第一个示例

格式化为字符串时,swift 存储的日期会变得不同

java.lang.ArrayIndexOutOfBoundsException : 2 >= 0 异常

java - 尝试获取任何 Android 设备的 MAC/硬件地址