91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

原型模式在Java實現深拷貝與淺拷貝的區別

發布時間:2024-09-29 12:20:29 來源:億速云 閱讀:86 作者:小樊 欄目:編程語言

原型模式(Prototype Pattern)是一種創建型設計模式,它允許通過復制(或克隆)一個現有對象來創建一個新對象,而無需重新實例化它。這種模式在Java中可以通過實現Cloneable接口和重寫clone()方法來實現深拷貝(Deep Copy)和淺拷貝(Shallow Copy)。

  1. 淺拷貝(Shallow Copy)

    • 淺拷貝創建一個新對象,這個新對象有著原始對象值的一份精確拷貝。如果拷貝的是基本數據類型,則直接拷貝其值;如果拷貝的是引用類型,則拷貝的是引用,即新對象和原始對象的引用指向的是同一個內存地址。
    • 在Java中,可以通過實現Cloneable接口并重寫clone()方法來實現淺拷貝。但需要注意的是,clone()方法默認執行的是淺拷貝,需要開發者手動實現深拷貝邏輯。
    • 例如:
public class ShallowCopyExample implements Cloneable {
    private int[] data;

    public ShallowCopyExample(int[] data) {
        this.data = data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

在這個例子中,ShallowCopyExample類實現了Cloneable接口并重寫了clone()方法。但是,由于data字段是一個數組,它仍然指向同一個內存地址,因此執行的是淺拷貝。 2. 深拷貝(Deep Copy)

* 深拷貝創建一個新對象,并遞歸地拷貝原始對象中的所有引用類型字段。這意味著新對象和原始對象的引用類型字段將指向不同的內存地址。
* 在Java中,實現深拷貝通常需要自定義拷貝邏輯,而不是簡單地重寫`clone()`方法。可以通過序列化和反序列化的方式來實現深拷貝,因為序列化會創建對象的深度副本。
* 例如:
public class DeepCopyExample implements Serializable {
    private int[] data;

    public DeepCopyExample(int[] data) {
        this.data = data;
    }

    public DeepCopyExample deepCopy() {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (DeepCopyExample) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException("Deep copy failed", e);
        }
    }
}

在這個例子中,DeepCopyExample類實現了Serializable接口,并重寫了一個deepCopy()方法。這個方法使用序列化和反序列化的技術來創建對象的深度副本。

總結:

  • 淺拷貝只復制對象本身和其中基本數據類型的值,而引用類型的字段仍然指向同一個內存地址。
  • 深拷貝遞歸地復制對象本身和其中所有引用類型字段的值,使得新對象和原始對象的引用類型字段指向不同的內存地址。
  • 在Java中,可以通過實現Cloneable接口并重寫clone()方法來實現淺拷貝;通過序列化和反序列化的方式來實現深拷貝。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开封县| 汝南县| 亳州市| 宜兰县| 定南县| 乌兰察布市| 三原县| 阿勒泰市| 蒙自县| 米林县| 鄢陵县| 商水县| 九龙县| 宝坻区| 衡山县| 深泽县| 南部县| 嘉义市| 嘉祥县| 望城县| 来宾市| 泸州市| 九寨沟县| 镇巴县| 观塘区| 遵义市| 甘洛县| 浏阳市| 苍南县| 景谷| 绥阳县| 济阳县| 松原市| 手游| 青神县| 高密市| 乐清市| 金昌市| 兴宁市| 车险| 合山市|