亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 對象中改變,反之亦然?!?/em>

這取決于你所說的“改變”是什么意思:

如果您的意思是更改引用的DogTail實例的狀態t,例如t.setSomething(someValue);,則是。這是同一個實例,無論是誰導致更改或更改發生在何處都無關緊要。

但是,如果您的意思是更改t克隆引用中的內容,例如t = new DogTail();,t原始引用中的內容將不會受到影響。在t后,在克隆和原將引用不同的實例。


查看完整回答
反對 回復 2021-08-25
  • 2 回答
  • 0 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號