如何克隆一个引用所指的对象呢?首先一个前提,他是可克隆的,我们要实现一个Clonable 接口。我们来看一个这个接口:
可以发现里面是空的,我们把这种空接口叫做标记接口,作用就是表示当前对象是可以被克隆的。
我们要实现克隆,首先要在类中重写Object的clone方法:
package csdn; import java.lang.reflect.Array; import java.util.Arrays; class student implements Cloneable{ public String name; public student(String name) { this.name = name; } @Override public String toString() { return "student{" + "name='" + name + '\'' + '}'; } @Override protected Object clone() throws CloneNotSupportedException { //重写父类Object的clone方法 return super.clone(); } } public class test2 { public static void main(String[] args) throws CloneNotSupportedException{ student student1=new student("张三"); student student2= (student)student1.clone(); //实现克隆,然后向下转型 System.out.println(student1); System.out.println(student2); } }
这样就实现了简单的克隆。
那我们再考虑另一种情况,我们来看这一段代码:
package csdn; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.lang.reflect.Array; import java.util.Arrays; class Money{ double money=12.25; } class student implements Cloneable{ public String name; public Money m=new Money(); public student(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException { //重写父类Object的clone方法 return super.clone(); } } public class test2 { public static void main(String[] args) throws CloneNotSupportedException{ student student1=new student("张三"); student student2= (student)student1.clone(); //实现克隆,然后向下转型 System.out.println(student1.m.money); System.out.println(student2.m.money); student2.m.money=99; System.out.println("=============="); System.out.println(student1.m.money); System.out.println(student2.m.money); } }
理论上来说,给克隆的对象改了值应该不会影响原对象的money值,我们这都是克隆出去的,但是当我们运行的时候却发现原来对象的money值也被修改了(这种拷贝方式叫做浅拷贝):
这跟我们的需求就不一样,这是什么原因呢?这是因为我们在克隆的时候没有克隆Money对象。
(糟糕的画图技术,希望大家能看明白)
我们解决方法是把Money也克隆出来就可以了,Money也必须支持克隆,也就是实现Clonable 接口。
然后我们再来修改一下student类里面的克隆方法:
此时我们再来看一下运行结果,就跟之前不一样了:
此时就达到了我们的深拷贝。所以如果要实现深拷贝,你当前对象里面的每一个对象都得克隆。
代码:
package csdn; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.lang.reflect.Array; import java.util.Arrays; class Money implements Cloneable{ double money=12.25; @Override protected Object clone() throws CloneNotSupportedException { //重写父类Object的clone方法 return super.clone(); } } class student implements Cloneable{ public String name; public Money m=new Money(); public student(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException { //重写父类Object的clone方法 student student=(student)super.clone(); //只是克隆了student对象 student.m=(Money)this.m.clone(); //克隆了student对象里面的Money对象 return student; } } public class test2 { public static void main(String[] args) throws CloneNotSupportedException{ student student1=new student("张三"); student student2= (student)student1.clone(); //实现克隆,然后向下转型 System.out.println(student1.m.money); System.out.println(student2.m.money); student2.m.money=99; System.out.println("=============="); System.out.println(student1.m.money); System.out.println(student2.m.money); } }