淺克隆(shallow clone)和深克隆(deep clone)是兩種不同的對象複製方法。 淺克隆會創建一個新對象,然後將原始對象的所有欄位複製到新對象中。如果欄位是基本類型,則它們的值將被直接複製。如果欄位是引用類型,則只會複製引用,而不會複製引用指向的對象。這意味著原始對象和克隆對象中的引用 ...
淺克隆(shallow clone)和深克隆(deep clone)是兩種不同的對象複製方法。
淺克隆會創建一個新對象,然後將原始對象的所有欄位複製到新對象中。如果欄位是基本類型,則它們的值將被直接複製。如果欄位是引用類型,則只會複製引用,而不會複製引用指向的對象。這意味著原始對象和克隆對象中的引用類型欄位將指向同一個對象。
深克隆不僅會複製原始對象的所有欄位,還會遞歸地複製引用類型欄位指向的所有對象。這意味著原始對象和克隆對象中的引用類型欄位將指向不同的對象。
在Java中,要實現對象的淺克隆和深克隆,可以讓你的類實現Cloneable
介面,並重寫Object
類中的clone
方法。
淺克隆可以通過調用super.clone()
方法來實現。這將創建一個新對象,並將原始對象的所有欄位複製到新對象中。如果欄位是基本類型,則它們的值將被直接複製。如果欄位是引用類型,則只會複製引用,而不會複製引用指向的對象。
深克隆需要手動實現。需要在clone
方法中創建一個新對象,並遞歸地複製所有引用類型欄位指向的對象。
下麵是一個示例類,它演示瞭如何實現淺克隆和深克隆:
1 public class MyClass implements Cloneable { 2 private int x; 3 private int[] y; 4 5 public MyClass(int x, int[] y) { 6 this.x = x; 7 this.y = y; 8 } 9 10 public int getX() { 11 return x; 12 } 13 14 public int[] getY() { 15 return y; 16 } 17 18 @Override 19 public MyClass clone() throws CloneNotSupportedException { 20 MyClass clone = (MyClass) super.clone(); 21 // Deep clone the y array 22 clone.y = y.clone(); 23 return clone; 24 } 25 }
在這個示例中,我們定義了一個名為MyClass
的類,它包含兩個欄位:一個整型欄位x
和一個整型數組欄位y
。我們讓這個類實現了Cloneable
介面,並重寫了clone
方法。
在clone
方法中,我們首先調用了super.clone()
方法來執行淺克隆。然後,我們對整型數組欄位y
執行了深克隆,即通過調用它的clone
方法來創建一個新的數組。
要使用這個類來創建淺克隆和深克隆對象,可以這樣寫:
int[] y = {1, 2, 3}; MyClass original = new MyClass(10, y); MyClass shallowClone = original.clone(); MyClass deepClone = original.clone(); System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY())); System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY())); System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY())); y[0] = 100; System.out.println("After modifying the original object:"); System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY())); System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY())); System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY()));
在這個示例中,我們創建了一個原始對象original
,然後使用它的clone
方法創建了兩個克隆對象:一個淺克隆對象和一個深克隆對象。接下來,我們修改了原始對象中的整型數組欄位。
運行這段代碼,將看到以下輸出:
Original: 10, [1, 2, 3] Shallow clone: 10, [1, 2, 3] Deep clone: 10, [1, 2, 3] After modifying the original object: Original: 10, [100, 2, 3] Shallow clone: 10, [100, 2, 3] Deep clone: 10, [1, 2, 3]
從輸出中可以看出,對原始對象的修改影響到了淺克隆對象,但沒有影響到深克隆對象。