cloneable接口
只有实现了cloneable接口的类,其实例对象才能调用 clone() 方法进行复制。
// 实现了cloneable接口的类。 class CloneableClass implements Cloneable{ public Test test = null; public double data1 = 0; public String data2 = null; public StringBuffer data3 = null; public CloneableClass(Test test,double data1,String data2,StringBuffer data3){ this.test = test; this.data1 = data1; this.data2 = data2; this.data3 = data3; } //重写clone()方法:调用object的 clone() 方法,实现“浅拷贝” public object clone() throws CloneNotSupportedException{ return super.clone(); } }
这样,CloneableClass这个类的对象就可以调用clone()进行浅拷贝了。
//clone()的使用方法 class Test{ public String userData = null; public Test(String userData){ this.userData = userData; } } Test test = new Test("abc"); StringBuffer sb = new StringBuffer("def"); CloneableClass cc1 = new CloneableClass(test, 1.5, "original", sb); CloneableClass cc2 = null; Object temp = cc1.clone(); if(temp instanceof CloneableClass){ cc2 = (CloneableClass) temp; }
所谓的浅拷贝:①对于基本数据类型,开辟新的内存,生成新的副本(值与母版相同,但址不同)。
②对于引用数据类型,并不生成新的副本,只是复制引用。(前后指向同一个内存)。
注意:①字符串不是基本数据类型,但是cc2.data2 = "new";不会改变母版字符串的值,而是生成一个新的String实例,使cc2.data2指向他,而cc1.data2仍指向之前的字符串。
②StringBuffer也不是基本数据类型,所以,cc2.data3=“new”,会使母版的cc1.data3也跟着改变(引用不变,但引用指向的内存中的数据改变)。
③“深拷贝”,可在clone()方法的重写中实现(浅拷贝直接调用object的clone,深拷贝需要自定义实现)。
//“深拷贝”:clone()方法的重写 public Object clone() throws CloneNotSupportedException { Test test = new Test(this.test.userData); double data1 = this.data1; String data2 = new String(this.data2); StringBuffer data3 = new StringBuffer(this.data3.toString()); CloneableClass copy = new CloneableClass(test, data1, data2, data3); return copy; }

浙公网安备 33010602011771号