java 深拷貝與淺拷貝
阿新 • • 發佈:2020-09-11
對於所有的基本型別都是淺拷貝,不論什麼方式;
但對於引用型別,當呼叫object的clone方法時,除String型別外,其他都為深拷貝;對於String物件型別要實現深拷貝必須要手動建立(new)一個新的String物件;
public class CloneAbleDemo { public static void main(String[] args) throws CloneNotSupportedException { CloneAbleImpl cloneAble = new CloneAbleImpl(1); cloneAble.setS("1"); // 如果當前類未實現CloneAble介面,則會直接丟擲CloneNotSupportedException異常資訊 CloneAbleImpl clone = cloneAble.clone(); System.out.println(clone.getValue()); //結果為false,深拷貝 System.out.println(cloneAble == clone); // 當為淺拷貝時,結果為true // 資料流程為 cloneAble物件的s欄位 -> clone物件的s欄位; 對於String型別的複製實際預設是淺拷貝 System.out.println(cloneAble.getS() == clone.getS()); // 當為深拷貝時,上述結果為false,而當前結果為true System.out.println(cloneAble.getS().equals(clone.getS())); } } class CloneAbleImpl implements Cloneable { private final int value; private String s; CloneAbleImpl(int value) { this.value = value; } public int getValue() { return this.value; } public String getS() { return this.s; } public void setS(String s) { this.s = s; } /** * 重寫object中的clone方法,並修改object中的clone的返回值和訪問性 * * @return * @throws CloneNotSupportedException */ @Override public CloneAbleImpl clone() throws CloneNotSupportedException { CloneAbleImpl cloneAble = (CloneAbleImpl) super.clone(); // 深拷貝,建立了一個新的String物件,對於s而言此時就是深拷貝 cloneAble.setS(new String(this.s)); return cloneAble; } }