天天看點

淺談深拷貝和淺拷貝

以前在部落格中看了大量關于深拷貝和淺拷貝的知識,還是不太清楚它們之間的關系,但是看了java核心技術 卷I 之後,對深拷貝和淺拷貝有了一定的認識。

1.先認識什麼是克隆?

對象的克隆是指建立一個新對象,且新對象的狀态和原對象的狀态相同,
當新克隆的對象進行修改時,不會影響原對象的狀态。
           

為了加深了解,貼書上的圖:

淺談深拷貝和淺拷貝

能夠看到原對象和克隆的對象是兩個獨立的對象,在克隆對象沒有修改之前,和原對象的狀态是相同的。

2.在說說拷貝的定義

當拷貝一個變量時,原始變量與拷貝變量引用同一個對象,這就是說,改變一個變量所引用的對象将會對另一個變量産生影響。如圖:

淺談深拷貝和淺拷貝

從圖中可以很清楚的看出,它們引用的是同一個對象,原變量的改變,會影響拷貝變量的改變,同理一樣。

**執行個體圖(java核心技術 卷I):

淺談深拷貝和淺拷貝

在這裡使用clone()方法,則就變為克隆對象,各自的狀态的改變不會影響。

克隆和拷貝的差別大概了解了,下面看看什麼是淺拷貝…

3.什麼是淺拷貝呢

在上面的圖中可以看出,當拷貝的時候,加上clone()方法,就變成了克隆一個對象,拷貝的結果會使得兩個域(簡單了解為變量)引用同一個對象,而克隆是原始對象和克隆對象共享這部分資訊。一般預設的克隆操作是淺拷貝,是以淺拷貝并沒有克隆包含在對象中的内部對象。

淺談深拷貝和淺拷貝

如果進行淺拷貝會發生什麼呢?

淺談深拷貝和淺拷貝

也可以這樣了解,淺拷貝就是共享域的資訊,不包含内部對象。

4.什麼是深拷貝呢

上面說了淺拷貝,所謂深拷貝就是不僅要拷貝域中的資訊,也要拷貝内部對象,
更重要的是要考慮到子對象可變,不像String類對象不可變,可以用淺拷貝。
這時候必須重修定義clone方法,以便實作克隆子對象的深拷貝
           

這時候就需要對每一個類作出判斷:

淺談深拷貝和淺拷貝

為了實作深拷貝,必須克隆 所有的可變的執行個體域。

淺談深拷貝和淺拷貝

大家可以參考《java核心技術 卷I》