1.实现clone的类首先需要继承cloneable接口。cloneable接口实质上是一个标识接口,没有任何接口方法。
2.在类中重写object类中的clone()方法。
3.在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone()方法。
4.把浅复制的引用指向原型对象的克隆体。
例子:
class Obj implements Cloneable
{
private int aInt = 0;
public int getaInt() {
return aInt;
}
public void setaInt(int int1){
aInt=int1;
}
public void changeInt(){
this.aInt=1;
}
public Object clone(){
Object o=null;
try{
o=(Obj)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
public class TestRef {
public static void main(String[] args) {
// TODO Auto-generated method stub
Obj a=new Obj();
Obj b=(Obj)a.clone();
b.changeInt();
System.out.println("a:"+a.getaInt());
System.out.println("b:"+b.getaInt());
}
}
程序运行结果为:
a:0
b:1
在C++语言中,当开发者自定义复制构造函数,会存在浅复制与深复制之分。java语言在重载clone()方法时也存在同样的问题,当类中只有一些基本的数据类型时,采用上述方法就可以了,但是当类包含一些对象时就要用到深复制了,实现方法是在对象调用clone()方法完成复制后,接着对对象中的非基本类型的属性也调用clone()方法完成深复制。
import java.util.Date;
class Obje implements Cloneable {
private Date birth = new Date();
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void changeDate() {
this.birth.setMonth(4);
}
public Object clone() {
Obje o = null;
try {
o = (Obje) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 完成深复制
o.birth = (Date) this.getBirth().clone();
return o;
}
}
public class TestRef1 {
public static void main(String[] args) {
Obje a=new Obje();
Obje b=(Obje)a.clone();
b.changeDate();
System.out.println("a="+a.getBirth());
System.out.println("b="+b.getBirth());
}
}
clone时
Object o=super.clone(); 先执行浅复制
对每一个对象attr执行以下语句
o.attr=this.gerAttr.clone();
返回o