修改后的方法参数与其在Java中的副本之间有什么区别?
问题描述:
这两种方法有什么区别吗?修改后的方法参数与其在Java中的副本之间有什么区别?
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;
}
答
不是从行为角度来看,而且两者都会显示出同样的效果。
从可读性的角度来看,第二个是国际海事组织有点误导,因为有暗示什么“有趣”发生,当没有。
答
是否有这两种方法有什么区别?
他们做的事情完全一样。 (尽管它们的写法不同)。
答
只是一个小小的澄清。你不是实际复制参数:
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
参数。我想你在谈论有关深复制和浅复制的概念的东西其中:
- 深层复制意味着克隆的主要对象及其所有内引用(简称:创建每个相关对象的新实例)。
-
浅拷贝意味着克隆的主要元素,保持其派生的元素的引用(如复制
Car
但是具有他的owner
引用相同owner
比原来Car
)。
这里,两种方法都是一样的。唯一的区别是额外的Model
对象。
答
行为是一样的。
Model m = model;
您正在创建一个与模型变量相同的局部变量。所以这不是一个副本。这是一个真正的参考变量副本。
m
和model
指的是同一个对象在堆内存
所以,如果你改变M或模型例如用set methods
m.setUpdated(new Date());
model.getUpdated(); --> will get the date object you set above
所以它不是对象本身的副本。它是参考变量的副本
对我来说看起来是一样的 - 除了短命和冗余变量“m” – DaveH
的行为?没有 – nachokk