1. 程式人生 > >Object的clone()方法、深拷貝、淺拷貝

Object的clone()方法、深拷貝、淺拷貝

         一個物件直接使用=,比如Object o1=new Object();

Object o2=o1;那麼問題是o1改變,o2也會改變。

這時候,需要不隨之前的物件改變而改變,使用clone。

需要注意clone是protect的,所以子類繼承Object ,否則丟擲異常

public Teacher clone() {
        try {
            return (Teacher) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }


就這樣複製成功,不受改變而影響。

但是原來物件一些屬性有些是可變物件,這些物件簡單的clone持引用,還是不可以。

原因在於你複製了物件的引用,這是不行的,如果物件改變,你也會改變。當然String

這種物件,他就是不變,所以他怎麼變都沒有事情,但是其他物件就不行了。

那麼記住,基本型別,String直接物件clone,其他需要在物件clone,其屬性還要繼續clone

public class Teacher implements Cloneable {
    String id;
    int num;
    Date date;
public Teacher clone(){
 Teacher t=  (Teacher)super.clone();
 t.date=(Date)t.date.clone();
return t;
}

}


相關推薦

python(6)——循環刪除list拷貝拷貝

改變 move 不能 指向 for 管理功能 字符 pan pre 列表的內存自動管理功能,在刪除列表中的元素時,python會自動對列表內存進行收縮,並移動列表中的元素以保證元素之間沒有間隙,所以使用 “循環+remove()方法”來刪除列表中元素時會出

Python中復制拷貝拷貝的區別

ron 一份 謝謝 操作 完成 函數 技術 也會 python解釋器 深拷貝定義(deepcopy) 在Python中,由於一切皆對象,所以任何變量都可以被引用,也即可以被賦值給任何變量。但是在Python中,給變量賦值,是區分的,一般情況下,Python中的變量賦值都是淺

Python——賦值拷貝拷貝

賦值 我們先定義一個變數a,然後指向數值為100的這個空間,然後建立的變數b和a指向了同一個空間地址。 物件之間的賦值本質就是引用的傳遞。 那麼思考一下,在針對操作可變變數資料的時候,修改了a的值之後b的變化是否會發生變化? 答案自然會是肯定的,因為賦值的本質只是引用的傳遞,只要傳

python直接賦值拷貝拷貝

python中,物件賦值實際上是物件的引用。當建立一個物件,將其賦值給另一個變數,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。 所以如果從單純的賦值語句來實現clone物件的話, 那可能bug出現的也會莫名其妙. Python中可以使用copy模組來複制物件.

python的賦值拷貝拷貝三者之間的區別

python的賦值、淺拷貝和深拷貝三者之間的區別 類似的文章已經很多了,但是在學習過程中,還是有一些模糊的地方,所以這裡把自己的理解記錄下來,便於以後複習,溫故知新! 1.賦值 賦值是將一個物件的地址賦值給一個變數,讓變數指向該地址( 舊瓶裝舊酒 )。 修改不可

C++的拷貝建構函式operator=運算子過載,拷貝拷貝explicit關鍵字

1、在C++編碼過程中,類的建立十分頻繁。 簡單的功能,當然不用考慮太多,但是從進一步深刻理解C++的內涵,類的結構和用法,編寫更好的程式碼的角度去考慮,我們就需要用到標題所提到的這些內容。 最近,在看單例模式,覺得十分有趣,然而如果想要掌握單例模式,就必須掌握這些內容。下

JS 資料型別賦值拷貝拷貝

js 資料型別六種 基本資料型別:Boolean. 布林值,true 和 false.null. 一個表明 null 值的特殊關鍵字。 JavaScript 是大小寫敏感的,因此 null 與 Null、NULL或其他變數完全不同。undefined. 變數未定義時的屬性。N

c++拷貝建構函式賦值運算子=過載拷貝拷貝

 關鍵詞:建構函式,淺拷貝,深拷貝,堆疊(stack),堆heap,賦值運算子 摘要:     在面向物件程式設計中,物件間的相互拷貝和賦值是經常進行的操作。     如果物件在宣告的同時馬上進行的初始化操作,則稱之為拷貝運算。例如:         class1 A(

python list的拷貝拷貝-以及初始化空白list的方法(2)

src 分享圖片 [1] 深拷貝 pen net .com 空白 tails 其實python對於深拷貝與淺拷貝的處理方式依然是很靈活的,甚至有一個專門的工具包copy來做個事情 來看以下這組list的拷貝方法: 已知lista是一個已經定義好了的list listb=l

【JS】拷貝拷貝的區別,實現拷貝的幾種方法

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 我們來舉個淺拷貝例

JavaScript中的拷貝拷貝方法總結

在日常的程式碼書寫中常常會遇到拷貝問題,今天我們就來總結一下常用的淺拷貝和深拷貝都有哪些實現方法。 淺拷貝常用方法: slice var arr1=[1,2],arr2=arr1.slice(); console.log(arr1);//[1,2] console.log(a

拷貝拷貝及幾種實現方法

rgb bsp for ace onos 都是 UNC get con 討論深拷貝與淺拷貝之前,要先回顧一下值傳遞與引用傳遞: 值傳遞: var a = 10; var b = a; b++; //console.log(a,b)//a:10 b:11 引用傳遞: v

結合多個例項深入理解js的拷貝拷貝,多種方法實現物件的拷貝

親們為什麼要研究深拷貝和淺拷貝呢,因為我們專案開發中有許多情況需要拷貝一個數組抑或是物件,但是單純的靠=“賦值”並不會解決所有問題,如果遇到引用型別的物件改變新賦值的物件會造成原始物件也發生同樣改變,而要去除影響就必須用到深拷貝,深拷貝,對於引用物件需要進行深拷貝才會去除影響。如果是值型別直接“=”

關於 Cloneable 介面 和 重寫 Object.clone() 方法的嘗試順便複習拷貝拷貝

一個類如果想重寫 Object 的 clone 方法,則必須實現 Cloneable 介面,否則呼叫 clone 方法時將會丟擲 CloneNotSupportException 異常 /** * Author: heatdeath * Date:

C#深度學習の----拷貝拷貝

chan 深度 保存 交流 typeof sta 二進制 object with 本人在進行編程的時候遇到一個問題,要對一個綁定的依賴屬性進行賦值,改變屬性中的某一部分,綁定的目標上的所有值都發生了變化,著並不是我想要的,由此引出深淺拷貝的問題。(請加群交流:4352266

js中的拷貝拷貝

所有 object 簡單的 col images new color 其他 java 深復制和淺復制只針對像 Object, Array 這樣的復雜對象的。簡單來說,淺復制只復制一層對象的屬性,而深復制則遞歸復制了所有層級。 深淺拷貝 的主要區別就是:復制的是引用(地址)還

python學習系列--拷貝拷貝

深拷貝 淺拷貝 copy deepcopy概念普通情下,復制一個對象是不會新開辟內存空間的,只是把新的對象名稱指向原有的內存地址,這種操作其實不是算是拷貝,只是新的引用。把新的對象置於新的內存空間中,才是拷貝。在python中,深淺拷貝的區別實際上是拷貝的深度不同。操作常見的‘=’號就是一種拷貝方式。pyth

js 中引用類型 的拷貝拷貝的區別

而是 query reac cat 避免 string val this 臨時 一、曾經在讀JQ源碼的時候,對深拷貝算是有了一點的理解。我們在項目中是不是經常會遇到這樣的問題呢? 後臺返回一個數組對象(引用類型).次數在頁面渲染中需要對部分數據進行處理 比如:銀行卡6234

javaScript之拷貝拷貝

func array efi name 內存空間 數據 xtend 是否 -- js中有兩種數據類型: 1. 基本類型 : Number、String、Boolean、Null、Undefined 2. 復雜類型 : Object 、Ar

談Java中的拷貝拷貝

detail tle pac err @override 復制對象 deep har 間接   淺談Java中的深拷貝和淺拷貝(轉載) 原文鏈接: http://blog.csdn.net/tounaobun/article/details/8491392 假如說你想復制一