在Java中,对象的克隆分为深克隆和浅克隆两种方式。两者虽然都是克隆,但是它们的实现方式和效果却存在很大的差别。
浅克隆(Shallow clone)根据需要逐一复制每个成员的值,但是对于成员中可能存在的对象,仅仅是拷贝了它的引用,而不是对象本身。这意味着,当这个被引用的对象被修改时,复制后的对象也会受到影响。因此,浅克隆只是创建了一个外层对象,而其内部的引用类型的成员是共享的。
public class Person implements Cloneable { private String name; private int age; private ArrayListhobbies; public Object clone() throws CloneNotSupportedException { return super.clone(); } }
深克隆(Deep clone)则不同,是指对整个对象及其所引用的对象进行复制,新的对象和原来的对象都是各自独立的,相互之间没有任何联系。这样,被复制后的对象不会受到原始对象的影响,可以完全独立使用。
public class Person implements Cloneable { private String name; private int age; private ArrayListhobbies; public Object clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); ArrayList list = new ArrayList<>(); for (String hobby : this.hobbies) { list.add(hobby); } p.hobbies = list; return p; } }
在进行克隆时,需要注意被克隆的对象必须实现Cloneable接口,否则会抛出CloneNotSupportedException异常。并且在深克隆时,要注意对于所有引用类型的变量都进行复制,否则可能会影响到新的对象。
总的来说,浅克隆适用于需要比较少的内存控制场景,深克隆则适用于需要完全独立复制对象的场景,对于哪种克隆方式要使用,取决于实际的场景需求。