1:為什么要使用clone()
如果你在一個函數(shù)內(nèi)需要把一個對象copy出來一份,并且在新copy出來的對象進行操作,不能影響源對象
這個時候你應(yīng)該怎么做?
首先這樣做是不對的
Person p1 =newPerson();
p1.setName("dog");
p1.setAge(10);
Person p2 = p1;
這個時候如果你把p2的name重新set一遍,那么p1.getName()將會得到p2.setName()的值。
因為你只是把p1的引用給了p2,在內(nèi)存地址上,p2和p1指向的是同一個對象,如果想要p2既有p1對象的所有內(nèi)容,又可以隨便修改不影響p1,該怎么辦呢?
1:笨方法
把p1所有的屬性拿出來,new 一個p2,重新set到p2的屬性內(nèi),這樣因為使用了new 會重新創(chuàng)建一個對象。
2:使用Java clone()方法
2:clone在Java內(nèi)的區(qū)別
在Java內(nèi)clone分為兩種,一種是淺克隆,一種是深克隆
那么什么叫淺克???
淺克隆指的是只克隆對象內(nèi)的基本屬性,比如int long double 還有String
String也是一個對象但是Java處理的比較特殊。
淺克隆不會克隆對象內(nèi)的對象,只會克隆此對象的引用,什么意思呢,看代碼~
那么什么叫深克???
深克隆就是對對象的完克隆,包括基本類型屬性和對象類型屬性
3:如何實現(xiàn)兩種克隆
如何實現(xiàn)淺克隆?
首先要實現(xiàn)Cloneable接口,并且要覆蓋object的clone方法,(object的克隆方法是protected)
如何實現(xiàn)深克隆?
1:首先引用對象內(nèi)必須實現(xiàn)淺克隆
2:必須在要實現(xiàn)深克隆的對象內(nèi),把引用對象設(shè)置為引用對象的clone方法返回的對象,代碼如下