gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:43 25 4
gpt4 key购买 nike

我知道可能已经有人问过了,但我的问题有所不同。我搜索过,我知道 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 的副本。

Dog dognew = dog1.clone();

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

最佳答案

clone() 方法的默认版本创建一个对象的浅拷贝。

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

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

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

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

dog.tail = tail;

return dog;
}

关于java - java clone() 是如何真正使用浅拷贝的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com