深克隆示例
- 为 birthday 单独写克隆代码;
- pig1 和 pig2 持有不同的 birthday;
import java.util.Date;
public class Pig implements Cloneable {
private String name;
private Date birthday;
public Pig(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Pig pig = (Pig)super.clone();
// 深克隆
pig.birthday = (Date) pig.birthday.clone();
return pig;
}
@Override
public String toString() {
return "Pig{" +
"name='" + name + '\'' +
", birthday=" + birthday +
'}' + super.toString().substring(super.toString().indexOf("@"));
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Date birthday = new Date(0L);
Pig pig1 = new Pig("佩奇",birthday);
Pig pig2 = (Pig) pig1.clone();
System.out.println(pig1);
System.out.println(pig2);
pig1.getBirthday().setTime(666666666666L);
System.out.println();
System.out.println(pig1);
System.out.println(pig2);
}
}
输出:
Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}@7530d0a
Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}@27bc2616
Pig{name='佩奇', birthday=Sat Feb 16 09:11:06 CST 1991}@7530d0a
Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}@27bc2616