天天看點

Object類中的clone方法 & 淺克隆和深克隆

想要産生一個新對象p2與原來對象p1具有相同的内容 

 最理想的方法就是調用clone方法,而不需要去先new出一個對象出來,

 然後再将p1的值指派給p2   因為clone()方法是一個本地方法

 native方法的效率一般來說都是遠高于java中的非native方法。

public class Clone {

public static void main(String[] args) throws CloneNotSupportedException {

Person p1 = new Person();

p1.setName("小強");

p1.setAge(12);

p1.setHireDay(new Date());

System.out.println(p1.getName() + ":" + p1.getAge());

Person p2 = (Person) p1.clone();

System.out.println(p2.getName() + ":" + p2.getAge());

System.out.println(p1 == p2);//false

System.out.println(p1.getHireDay() == p2.getHireDay());

//開始由于是淺clone 是以person對象的子對象hireDay沒有進行clone              //true  指向同一片對記憶體區域

//在person類中的clone方法中對hireDay進行clone後                                           //false  指向不同區域

}

}

import java.util.Date;

public class Person implements Cloneable{

private String name;

private int age;

private Date hireDay = null;//引用類型,用來說明淺克隆和深克隆

public Date getHireDay() {

return hireDay;

}

public void setHireDay(Date hireDay) {

this.hireDay = hireDay;

}

@Override

protected Object clone() throws CloneNotSupportedException {

Person p = null;

p = (Person) super.clone();

//p.hireDay = (Date) hireDay.clone();

return p;

}

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;

}

}

在Person類中想要覆寫clone方法  就要繼承Cloneable接口  否則會抛出CloneNotSupportedException異常。

由于Object類中的clone方法是protected方法,在複寫該方法時,需要聲明為public