簡體   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