首页 > 解决方案 > java clone() 是如何真正使用浅拷贝的?

问题描述

我知道它可能已经被问过了,但我的问题是不同的。我已经搜索过,我知道 java 方法object.clone()使用浅拷贝,这意味着复制引用而不是实际对象。假设我有一个狗类

 Class Dog{
     public Dog(String name, DogTail tail, DogEar ear){
          this.name = name;
          this.tail = tail;
          this.ear  = ear;   
     } 
} 
DogTail t = new DogTail(); 
DogEar ear = new DogEar(); 
Dog dog1 = new Dog("good", t,ear);

假设我想获得 dog1 的副本。

狗 dognew = dog1.clone();

如果此clone()方法使用浅拷贝,则意味着复制引用。因此,如果我更改上面创建的 t 对象或 ear 方法,它会在 dognew 对象中更改,反之亦然。这种克隆效果如何?这个问题的产生是因为有人说创建一个巨大的对象比克隆更糟糕,因为你在使用clone()方法时会节省性能。

标签: javaclone

解决方案


方法的默认版本clone()创建对象的浅表副本。

对象的浅拷贝将具有原始对象所有字段的精确副本。如果原始对象具有对其他对象的任何引用作为字段,则仅将这些对象的引用复制到克隆对象中,不会创建这些对象的副本。这意味着通过克隆对象对这些对象所做的任何更改都将反映在原始对象中,反之亦然。

要创建对象的深层副本,您可以覆盖该clone()方法。

protected Object clone() throws CloneNotSupportedException
{
    DogTail tail = (DogTail) this.tail.clone();

    Dog dog = (Dog) super.clone();

    dog.tail = tail;

    return dog;
}

推荐阅读