创建一个Sheep2的类,实现Cloneable接口。以下是具体代码:
import java.util.Date;
public class Sheep2 implements Cloneable{
private String sname;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj =super.clone(); //直接调用object对象的clone方法!
//添加如下代码,实现深复制(deep clone)
Sheep2 s =(Sheep2)obj;
s.birthday =(Date) this.birthday.clone(); //把属性叶克隆
// System.out.println(obj==s);
return obj; //在这里,s与obj指向的是同一个对象
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Sheep2(String sname, Date birthday) {
super();
this.sname = sname;
this.birthday = birthday;
}
public Sheep2() {
}
}
值得一提的是,在clone()方法中,返回的是obj,而不是s,(两者其实并没有区别,如注释中所说,这两者在内存中指向的是同一个对象)。System.out.println(obj==s);的结果为true!
然后,创建测试用例Client2,以下为具体代码:
import java.util.Date;
public class Client2 {
public static void main(String[] args) throws Exception {
Date date =new Date(1655464864484L);
Sheep2 s1 =new Sheep2("哆啦A梦",date);
Sheep2 s2 =(Sheep2) s1.clone(); //实现深复制,s2的birthday是一个新对象
System.out.println(s1); //输出s1对象
System.out.println(s1.getSname()); //输出s1对象的名称
System.out.println(s1.getBirthday()); //输出s1对象的生日
date.setTime(165464854984654L); //改变s1对象的生日
System.out.println(s1.getBirthday()); //输出
s2.setSname("哆啦B梦");
System.out.println(s2); //输出s2对象
System.out.println(s2.getSname()); //输出s2对象的名称
System.out.println(s2.getBirthday()); //输出s2对象的生日(结果为原生日,并没有被改变)
}
}
编译并运行
输出结果:
prototype.Sheep2@3ce53108
哆啦A梦
Fri Jun 17 19:21:04 CST 2022
Thu May 16 19:43:04 CST 7213
prototype.Sheep2@2afa3ac1
哆啦B梦
Fri Jun 17 19:21:04 CST 2022
可以看出,s1与s2为两个完全不同的对象,但有着相同的属性。
且,改变s1的date后,s2的date并没有改变,说明s2有着自己的date对象,即复制了s1原来的date对象。(若是浅克隆,是不会另外再复制一个date对象的。)
以上,两者之间,实现了深克隆。