2013-06-21 51 views
0

这两种方法有什么区别吗?修改后的方法参数与其在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; 
} 
+1

对我来说看起来是一样的 - 除了短命和冗余变量“m” – DaveH

+0

的行为?没有 – nachokk

回答

3

不是从行为角度来看,而且两者都会显示出同样的效果。

从可读性的角度来看,第二个是国际海事组织有点误导,因为有暗示什么“有趣”发生,当没有。

0

是否有这两种方法有什么区别?

他们做的事情完全一样。 (尽管它们的写法不同)。

1

只是一个小小的澄清。你不是实际复制参数:

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对象。

1

行为是一样的。

Model m = model; 

您正在创建一个与模型变量相同的局部变量。所以这不是一个副本。这是一个真正的参考变量副本。

mmodel指的是同一个对象在堆内存

所以,如果你改变M或模型例如用set methods

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

所以它不是对象本身的副本。它是参考变量的副本

相关问题