java clone() 是如何真正使用浅拷贝的?

How does java clone() really use shallow copy?

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

 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 的副本。

Dog dognew = dog1.clone();

如果这个clone()方法使用的是浅拷贝,就是复制引用。因此,如果我更改上面创建的 t 对象或 ear 方法,它会在 dognew 对象中发生变化,反之亦然。这个克隆有多好?这个问题的诞生是因为有人说创建一个巨大的对象比克隆更糟糕,因为使用 clone() 方法可以节省性能。

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

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

要创建对象的深拷贝,您可以覆盖 clone() 方法。

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

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

    dog.tail = tail;

    return dog;
}

"So If I change t object created above or ear method, it's gonna change in the dognew object or vice versa."

这取决于你的意思 "change":

如果您的意思是更改 t 引用的 DogTail 实例的状态,例如t.setSomething(someValue);,然后是。这是同一个实例,无论是谁导致更改或更改发生在何处。

如果您的意思是更改克隆引用中的 t,例如原来的t = new DogTail();t不受影响。克隆和原始文件中的 t 之后将引用不同的实例。