java的克隆实现方式有两种一种是实现cloneable接口并重写Object的clone()方法,另外一种是实现serializable接口;
克隆有分为浅度克隆和深度克隆。浅克隆对象的成员变量是引用类型,复制的是地址给克隆对象,是值类型,复制是内容。深度克隆无论对象的成员变量是值类型还是引用类型,内容都复制给克隆对象。假如要克隆的类A中有一个引用类型的变量b时,当重写A对象的clone方法时,把B对象的克隆方法返回的对象赋值给A对象的成员变量b。代码如下:
protected Object clone(){
Student stu=null;
try {
stu=(Student)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
stu.add=(Address)add.clone();
return stu;
}
用实现cloneable实现深度克隆也有些局限性,如果对象中有引用类型,引用类型里面又有引用类型,这样用实现cloneable接口来实现克隆就比较麻烦了。
用实现serializable同样可以实现深度克隆。将要克隆的对象实现serializable接口,并写个方法返回对象。方法代码如下:
public Outer myclone() {
Outer out=null;
try {
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ob=new ObjectInputStream(bis);
out=(Outer)ob.readObject();
}catch(Exception e) {
e.printStackTrace();
}
return out;
}
此方法通过序列化,反序列的方式实现克隆对象。