我知道可能已經有人問過了,但我的問題有所不同。我已經搜索過,我知道 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;
}

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
“所以如果我改變上面創建的 t 對象或 ear 方法,它會在 dognew 對象中改變,反之亦然?!?/em>
這取決于你所說的“改變”是什么意思:
如果您的意思是更改引用的DogTail
實例的狀態t
,例如t.setSomething(someValue);
,則是。這是同一個實例,無論是誰導致更改或更改發生在何處都無關緊要。
但是,如果您的意思是更改t
克隆引用中的內容,例如t = new DogTail();
,t
原始引用中的內容將不會受到影響。在t
后,在克隆和原將引用不同的實例。
添加回答
舉報
0/150
提交
取消