java如何实现对象的克隆
作者:binjava克隆有2种方式,使用clone方法去克隆,或者使用序列化的方式进行克隆
1.使用clone方法进行克隆
需要实现Cloneable接口,并且实现他的clone方法,方法中调用super的clone方法生成一个新的对象返回
class Student implements Cloneable{ @Override public Object clone() { Student stu = null; try{ stu = (Student)super.clone(); }catch(CloneNotSupportedException e) { e.printStackTrace(); } return stu; } }
深度克隆:指的是不仅仅克隆当前对象,还要克隆当前对象的属性的引用对象。
class Student implements Cloneable{ //这里引用的mother private Mother mother; @Override public Object clone() { Student stu = null; try{ //这里是浅拷贝 stu = (Student)super.clone(); }catch(CloneNotSupportedException e) { e.printStackTrace(); } //拷贝他的引用,完成深度拷贝 stu.mother = (Mother)mother.clone(); return stu; } }
2.使用serializable接口
序列化时会生成一个对象的拷贝副本,并且原对象还在内存中,再进行反序列化拷贝对象。
public class Outer implements Serializable{ private static final long serialVersionUID = 31243123172941L; //最好是显式声明ID public Inner inner; //Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化] public Outer myclone() { Outer outer = null; try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); // 将流序列化成对象 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); outer = (Outer) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } //返回克隆后的对象 return outer; } }
序列化克隆本质就是深度克隆,但是引用的属性也要继承Serializable接口
public class Outer implements Inner{ ... }