在Java編程中,克隆是指創建一個與原始對象完全相同的新對象。然而,在克隆過程中,有兩種不同的方法:淺克隆和深克隆。
淺克隆
public class ShallowClone implements Cloneable { private int[] intArr; public ShallowClone() { intArr = new int[10]; for (int i = 0; i< intArr.length; i++) { intArr[i] = i; } } public void setInt(int index, int value) { intArr[index] = value; } public int[] getInt() { return intArr; } public Object clone() throws CloneNotSupportedException { return super.clone(); } }
在淺克隆中,當原始對象被克隆時,對象的所有基本類型字段(比如int、float等)和非基本類型字段(比如String)都會被復制,但對象所包含的引用類型的成員變量只是復制了引用,而不是克隆了對象本身。因此,如果原始對象的引用類型的成員變量改變了,那么它被克隆的副本也會改變。
深克隆
public class DeepClone implements Cloneable { private int[] intArr; public DeepClone() { intArr = new int[10]; for (int i = 0; i< intArr.length; i++) { intArr[i] = i; } } public void setInt(int index, int value) { intArr[index] = value; } public int[] getInt() { return intArr; } public Object clone() throws CloneNotSupportedException { DeepClone deepClone = (DeepClone) super.clone(); deepClone.intArr = (int[]) intArr.clone(); return deepClone; } }
深克隆是指在克隆一個對象時,將該對象所有的引用類型成員變量都進行遞歸地克隆,從而獲得一個全新的,與原來完全獨立的對象副本。在深克隆中,當原始對象被克隆時,所有的成員變量(包括基本類型和引用類型)都會被復制,并且這些復制的對象在內存中也是不同的,從而保證了克隆對象的獨立性。
在實際編程中,我們通常會根據需求選擇是否要使用深克隆。如果對象的引用類型成員變量無須修改,那么使用淺克隆是更為簡潔和高效的。而如果引用類型成員變量有可能被改變,那么使用深克隆將更為安全。