java——深克隆

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();
}
}
}

猜你喜欢

转载自blog.csdn.net/weixin_42981168/article/details/88080257