clone是浅拷贝。 这里说浅拷贝是指clone后ArrayList中的每一个元素都指向了原先元素的引用。所以一旦改变一个数组的元素另一个数组也会变化。 下面的代码用StringBuilder来说明问题应该很好理解 Java本身不直接提供深拷贝的接口需要自己实现。自己手动将ArrayList的中的每个元素创建一个副本。 如果是自己设计的类可以自己覆...
由CloneDemo类可以看出,没有重写clone方法,对象中的引用数据类型只是复制了该引用数据类型的引用,并没有在内存空间中开辟空间复制该引用数据类型,即对该引用数据类型进行了浅拷贝而不是深拷贝。 packageJDKSource.lang;publicclassCloneDemoimplementsCloneable{privateintnum;privateStringname;privateHelperhelper;publicCloneD...
基本类型的深拷贝 首先,我们来看一个基本类型的示例,它将展示clone方法是如何进行深拷贝的。 publicclassPrimitiveTypeimplementsCloneable{privateintnumber;publicPrimitiveType(intnumber){this.number=number;}@OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}publicstaticvoidmain(String[]...
该成员实现Cloneable接口并覆盖clone()方法,不要忘记提升为public可见。 同时,修改被复制类的clone()方法,增加成员的克隆逻辑。 ② 如果被复制对象不是直接继承Object,中间还有其它继承层次,每一层super类都需要实现Cloneable接口并覆盖clone()方法。 与对象成员不同,继承关系中的clone不需要被复制类的clone()做多余的...
person2是通过person1拷贝出来的对象,由于默认使用了Object.clone的浅拷贝,person2拷贝了person1的age,但由于name是引用类型,person2只是拷贝了person1的name的指针而言。看一下输出: mi@mi-HP:~/develop/code/JavaCode$ java Hello.java person1 = Person@291caca8, person1.name = String@385e9564 ...
上图展示了浅拷贝:对于非基本数据类型,clone过后,结果两个指针指向了同一块儿内存空间,所以仅仅是浅拷贝,这样的话如果对一个对象进行操作,另一个内容也会变,这显然是不合理的,应该每个对象分别保存自己的数据...浅拷贝和深拷贝例子: [java] view plaincopy importjava.util.Vector; public class Student implements...
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在克隆(Clone)操作中经常遇到的两个概念,它们描述了克隆操作对于对象内部引用的处理方式。 浅拷贝(Shallow Copy): 浅拷贝指在克隆操作中,只复制对象本身以及对象内部的基本数据类型的属性,而不复制对象内部的引用类型的属性。
2 而浅拷贝则覆盖了Object.clone()和implemnents Cloneable来实现,可以把当前被拷贝对象实例复制一份出来独立,但是对于引用类型(除了String)成员变量来说其拷贝的依旧是地址,而不是在内存拷贝多处一个副本然后指向过去。 3 对于2中的问题,深拷贝就能解决了,只不过他要在每个被拷贝的引用类型成员变量中覆盖clone方法...
浅拷贝只复制对象的引用而不复制对象的内容;深拷贝则不仅复制引用,还复制对象的内容。默认情况下,Java中的clone方法是浅拷贝。如果需要实现深拷贝,我们需要手动实现。总的来说,Java中的clone方法是一种强大的工具,可以帮助我们创建对象的副本。然而,它也有一些需要注意的地方,特别是当我们需要处理包含非序列化字段的...