在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; } }
深克隆是指在克隆一个对象时,将该对象所有的引用类型成员变量都进行递归地克隆,从而获得一个全新的,与原来完全独立的对象副本。在深克隆中,当原始对象被克隆时,所有的成员变量(包括基本类型和引用类型)都会被复制,并且这些复制的对象在内存中也是不同的,从而保证了克隆对象的独立性。
在实际编程中,我们通常会根据需求选择是否要使用深克隆。如果对象的引用类型成员变量无须修改,那么使用浅克隆是更为简洁和高效的。而如果引用类型成员变量有可能被改变,那么使用深克隆将更为安全。