Java中对象的clone可以通过Object中的clone()来实现,步骤如下:
1、实现cloneable接口(cloneable只代表一种能力,不需要重写任何方法)
2、重写clone方法,在方法中继承Object的clone方法即可(Object中clone()为protected,不能直接使用,当没有实现cloneable是会抛出CloneNotSupportedException)
需要注意的是,通过继承实现的clone为浅克隆,意思是虽然重新创建了一个当前对象,但这个对象里面的对象指向的都是同一个对象;如果需要深克隆可以通过序列化来实现。代码如下
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Aa implements Cloneable,Serializable {
private Bb d;//Bb为支持序列化功能的任意对象
public Aa(String b, String c) {
this.d=new Bb(b,c);
}
public Bb getD() {
return d;
}
@Override
public Aa clone(){
Object o=null;
try {
o=super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (Aa)o;
}
public Aa deepClone(){
Object o=null;
try {
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);
o= objectInputStream.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return (Aa)o;
}
public static void main(String [] args){
Aa a=new Aa("a","b");
Aa b= a.clone();
Aa c= a.deepClone();
System.out.println(a==b);//false
System.out.println(a.getD()==b.getD());//true
System.out.println(a==c);//false
System.out.println(a.getD()==c.getD());//false
}
}