首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java clone 方法深度解析:淺層複製與深層複製實作範例

     編輯:Java 相關知識

什麼是 clone?

在程式設計中,常需要一個與現有物件內容相同但獨立的新物件。單純賦值 (B = A) 僅複製參考,修改 B 會影響 A。clone() 能建立獨立副本。

實作 clone 的標準步驟

  1. 實作 Cloneable 介面 (標記介面,無方法)。
  2. 覆寫 clone() 方法,拋棄 protected 改為 public。
  3. 在方法中呼叫 super.clone() 並捕獲 CloneNotSupportedException。
class CloneClass implements Cloneable {
    public int aInt;
    public Object clone() {
        CloneClass o = null;
        try { o = (CloneClass) super.clone(); }
        catch (CloneNotSupportedException e) { e.printStackTrace(); }
        return o;
    }
}

淺層複製 vs 深層複製

  • 淺層複製 (預設):Object.clone() 逐位複製欄位。基本型別複製值,參考型別複製參考地址,指向同一個物件。
  • 深層複製:參考型別欄位也需遞迴 clone,使新物件與原物件完全無共享參考。

深層複製範例

class DeepClone implements Cloneable {
    private int[] data;
    private OtherObject ref;

    public DeepClone(int[] data, OtherObject ref) {
        this.data = data;
        this.ref = ref;
    }

    @Override
    public DeepClone clone() {
        try {
            DeepClone cloned = (DeepClone) super.clone();
            // 基本型別陣列需手動複製
            cloned.data = this.data.clone();
            // 參考物件需支援 clone
            cloned.ref = this.ref.clone();
            return cloned;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

為何要實作 Cloneable?

Object.clone() 是 native 方法,效率高。若類別未實作 Cloneable 卻呼叫 super.clone(),會拋出 CloneNotSupportedException。實作介面即告知 JVM 該類別允許被複製。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved