【问题标题】:What's the difference between a modified method parameter and that of a copy of it in Java?修改后的方法参数与 Java 中的方法参数副本有什么区别?
【发布时间】:2013-06-18 21:16:23
【问题描述】:
这两种方法有什么区别吗?
public Long saveModel(Model model) {
model.setUpdated(new Date());
Long id = dao.save(model);
return id;
}
和
public Long saveModel(Model model) {
Model m = model;
m.setUpdated(new Date());
Long id = dao.save(m);
return id;
}
【问题讨论】:
标签:
java
variables
methods
parameters
arguments
【解决方案1】:
不是从行为的角度来看,同时运行两者会显示同样多。
从可读性的角度来看,第二个是 IMO 有点误导,因为有一个 暗示“有趣”的事情正在发生,而实际上并没有。
【解决方案2】:
只是一个小小的说明。您实际上并没有复制参数:
public Long saveModel(Model model) {
Model m = model; //Instance of the Model class that references the parameter
m.setUpdated(new Date());
Long id = dao.save(m);
return id;
}
相反,您在m 中存储了对model 参数的新引用。我认为您在谈论与 Deep Copy 和 Shallow Copy 的概念相关的内容,其中:
-
深拷贝意味着克隆主对象及其所有内部引用(简而言之:为每个涉及的对象创建新实例)。
-
浅拷贝意味着克隆主元素,保留对其派生元素的引用(例如复制
Car,但让他的owner引用与原始owner相同的owner)。
在这里,两种方法都是一样的。唯一的区别是额外的Model 对象。
【解决方案3】:
行为是一样的。
Model m = model;
您正在创建一个引用相同模型变量的局部变量。所以它不是副本。这确实是一个参考变量副本。
m和model指的是堆内存中的同一个对象
因此,如果您更改 m 或模型,例如使用 set methods
m.setUpdated(new Date());
model.getUpdated(); --> will get the date object you set above
所以它不是对象本身的副本。它是引用变量的副本
【解决方案4】:
这两种方法有什么区别吗?
他们做同样的事情。 (不过,它们的写法不同。)