在Java中,什么是浅拷贝?

java.util.Calendar.clone()返回“…具有相同属性的新日历”,并返回“此日历的浅拷贝”。

这似乎不是一个浅的副本,如回答here在SO。这个问题被标记为语言不可知,Java似乎不遵循语言不可知的定义。当我通过代码我注意到结构和元素被复制到这个新的对象,超过语言不可知的结构只。

在Java中,什么是浅拷贝?

它与Java深层副本(如果存在)有什么不同?

浅拷贝只是复制类中引用的值。深拷贝复制值。给定:

class Foo {
  private Bar myBar;
  ...
  public Foo shallowCopy() {
    Foo newFoo = new Foo();
    newFoo.myBar = myBar;
    return newFoo;
  }

  public Foo deepCopy() {
    Foo newFoo = new Foo();
    newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ...
    return newFoo;
  }
}

Foo myFoo = new Foo();  
Foo sFoo = myFoo.shallowCopy();  
Foo dFoo = myFoo.deepCopy();  

myFoo.myBar == sFoo.myBar => true  
myFoo.myBar.equals(sFoo.myBar) => true  
myFoo.myBar == dFoo.myBar => **false**  
myFoo.myBar.equals(dFoo.myBar) => true  

在这种情况下,浅拷贝具有相同的引用(==),而深拷贝仅具有等效引用(.equals())。

如果对浅复制引用的值进行更改,则副本将反映该更改,因为它共享相同的引用。如果对深度复制的引用的值进行更改,则副本不会反映该更改,因为它不共享相同的引用。

C-ism

int a = 10; //init
int& b = a; //shallow - copies REFERENCE
int c = a;  //deep - copies VALUE
++a;

结果:

a is 11  
*b is 11  
c is 10
http://stackoverflow.com/questions/1175620/in-java-what-is-a-shallow-copy

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Java中,什么是浅拷贝?