为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2021-08-25 17:39:30
我知道可能已经有人问过了,但我的问题有所不同。我已经搜索过,我知道 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()方法的同时节省了性能。
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

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


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


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


protected Object clone() throws CloneNotSupportedException

{

    DogTail tail = (DogTail) this.tail.clone();


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


    dog.tail = tail;


    return dog;

}


查看完整回答
反对 回复 2021-08-25
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

“所以如果我改变上面创建的 t 对象或 ear 方法,它会在 dognew 对象中改变,反之亦然。”

这取决于你所说的“改变”是什么意思:

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

但是,如果您的意思是更改t克隆引用中的内容,例如t = new DogTail();t原始引用中的内容将不会受到影响。在t后,在克隆和原将引用不同的实例。


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信