1,深克隆:无论成员变量是否为引用类型,所有的成员变量都复制一份已达到完全的克隆。(但是系统默认不支持,如果需要,需要程序员自己动手去做)
2,实现深克隆的步骤
(1):实现Cloneable接口
(2):重写clone()方法
(3):先实现浅克隆
例如:Employee emp = (Employee)super.clone();
(4)再在浅克隆的基础上,进一步克隆需要的成员变量(引用类型),例如 Date birthday
(5)在引用类引用的时候,记得处理异常(最好使用try…catch的形式)
例如
+++++++++++++++++++++++++++++++++++++++++++++++++++
import java.util.Date;
public class Employee implements Cloneable{
//成员变量
private String name;
private int age;
private Date birthday;
public Employee() {
}
public Employee(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
//自定义一个成员方法,来改变生日
public void changeBirthday(){
//在生日原有的月份上面+1
this.birthday.setMonth(this.getBirthday().getMonth()+1);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee)) return false;
Employee employee = (Employee) o;
if (getAge() != employee.getAge()) return false;
if (!getName().equals(employee.getName())) return false;
return getBirthday().equals(employee.getBirthday());
}
@Override
public int hashCode() {
int result = getName().hashCode();
result = 31 * result + getAge();
result = 31 * result + getBirthday().hashCode();
return result;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
//先实现浅克隆
Employee emp=(Employee)super.clone();
//在浅克隆出来的对象基础上,进一步克隆所需要的成员变量 Date birthday
if(emp.birthday!=null){
//调用Date类型自己的克隆方法
Date cloneDate=(Date)emp.birthday.clone();
//将克隆出来的日期,重新赋值给克隆出来的员工对象employee
emp.setBirthday(cloneDate);
}
return emp;
}
}
+++++++++++++++++++++++++++++++++
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EmployeeDemo {
public static void main(String[] args){
SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
Date date=null;
try {
date=sdf.parse(“1990-01-09 11:35:20”);
} catch (ParseException e) {
e.printStackTrace();
}
Employee emp1=new Employee(“jerry”,20,date);
Employee emp2=new Employee(“jerry”,20,date);
System.out.println(“原对象:”+emp1);
System.out.println(“两个对象是否相等:”+emp1.equals(emp2));
System.out.println("====================");
//深克隆
try {
Employee emp3=(Employee)emp1.clone();
System.out.println(“两个对象是否相等:”+emp1.equals(emp3));
//克隆后,改变原有对象的引用类型的成员变量Date,看克隆对象是否有变化
emp1.changeBirthday();
System.out.println(“原对象:”+emp1);
System.out.println(“克隆对象:”+emp3);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}