淺拷貝和深拷貝
這里會涉及到淺拷貝和深拷貝蛾派,我之前的文章(Java的傳值方式中)也有提到
image-20210528222945533
然而像基本類型的數(shù)據(jù)俄认,例如int、long這些洪乍,它們之間用==作比較都是true眯杏,因為它們在內(nèi)存中都是作為常量來存儲的。==是在比地址壳澳,而.equls可以在重寫之后比較對象數(shù)據(jù)的差別.
clone
這里寫一個clone方法的實例岂贩,首先是實現(xiàn)Object自帶的clone方法,用這個方法創(chuàng)建一個對象巷波,然后在這個clone上做一些修改萎津,解決淺拷貝的問題。
代碼
實現(xiàn)clone方法的類:PrototypeEntity
/**
* Created on 2021/5/28.
*
* @author xuxiaobai
*/
public class PrototypeEntity implements Cloneable {
private int a;
private User b;
public PrototypeEntity(){}
public PrototypeEntity(int a,User b){
this.a=a;
this.b=b;
}
/**
* 實現(xiàn)Object自帶的clone方法
* @return
* @throws CloneNotSupportedException
*/
@Override
public PrototypeEntity clone() throws CloneNotSupportedException {
return (PrototypeEntity) super.clone();
}
/**
* 解決淺拷貝的clone方法
* @return
* @throws CloneNotSupportedException
*/
public PrototypeEntity clone1() throws CloneNotSupportedException {
PrototypeEntity clone = (PrototypeEntity) super.clone();
clone.b=new User(this.b.getName(),this.b.getAge());
return clone;
}
/**
* get褥紫、set方法省略
*/
}
測試類:PrototypeTest
/**
* Created on 2021/5/28.
*
* @author xuxiaobai
*/
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
PrototypeEntity p1=new PrototypeEntity(1,new User("xiaobai",18));
//原始的clone方法
PrototypeEntity clone1 = p1.clone();
PrototypeEntity clone2= p1.clone1();
System.out.println("----clone1----");
System.out.println("a:"+ (p1.getA()==clone1.getA()));
System.out.println("b:"+ (p1.getB()==clone1.getB()));
System.out.println("----clone2----");
System.out.println("a:"+ (p1.getA()==clone2.getA()));
System.out.println("b:"+ (p1.getB()==clone2.getB()));
}
/**
* 結(jié)果
* ----clone1----
* a:true
* b:true
* ----clone2----
* a:true
* b:false
*/
}
image
clone1的b和p1的b是相同的,這說明使用Object的clone方法的話瞪慧,b對象沒有克隆成功髓考,只是一個淺拷貝。
而clone2的b和p1的b是不同的弃酌,說明使用clone1方法的話氨菇,b對象克隆成功了,是另外一個新的對象妓湘。
總結(jié)
Object的clone方法是一個本地方法查蓉,我們是查看不了的,不過我們可以看出榜贴,clone方法不會去重新創(chuàng)建對象內(nèi)的成員屬性豌研,是直接把原來對象的成員屬性的地址復(fù)制過來,可以說Object的clone方法只是一個淺拷貝唬党,跟方法的傳輸傳遞一樣鹃共。想要實現(xiàn)深拷貝就得自己去實現(xiàn)和修改clone方法,好像可串行化也可以實現(xiàn)深拷貝驶拱,以后有機(jī)會我去試試霜浴。
image