繁体   English   中英

在Java中,修改后的方法参数与其副本之间有什么区别?

[英]What's the difference between a modified method parameter and that of a copy of it in 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;
}

从行为的角度来看,运行两者将显示出同样多的效果。

从可读性的角度来看,第二个是IMO有点误导,因为这暗示着正在发生“有趣”的事情,而实际上却没有。

只需一点澄清。 您实际上并没有复制参数:

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; 

您正在创建引用与模型变量相同的局部变量。 因此,它不是副本。 确实是参考变量副本。

mmodel引用堆内存中的同一对象

因此,如果您使用set methods更改m或模型

m.setUpdated(new Date());
model.getUpdated(); --> will get the date object you set above

因此,它不是对象本身的副本。 这是参考变量的副本

这两种方法之间有什么区别吗?

他们做的完全一样。 (不过,它们的写法有所不同。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM