Java中的對象克隆是一個比較常見的操作,主要分為淺克隆和深克隆兩種方式。其中,new是創(chuàng)建新對象的方式,而clone則是復(fù)制已有對象的方法。
在Java中,使用new創(chuàng)建一個新的對象時,會在內(nèi)存中開辟一個新的空間,以存放該對象的數(shù)據(jù)。相對而言,使用clone操作則是將一個已有的對象數(shù)據(jù)復(fù)制到一塊新的空間中,使得兩個對象的數(shù)據(jù)一致。
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
// 使用new方式創(chuàng)建對象
Person person1 = new Person("張三",23);
Person person2 = person1;
person2.setAge(22);
System.out.println(person1.getAge());//輸出22
// 使用clone方式創(chuàng)建對象
Person person3 = (Person)person1.clone();
System.out.println(person3.getAge());//輸出23
}
}
上述代碼中,我們定義了一個Person類,該類實(shí)現(xiàn)了Cloneable接口,并重寫了clone()方法。在Test類中,我們使用Person類的new方式和clone復(fù)制方式分別創(chuàng)建了兩個新的對象。當(dāng)我們使用new方式創(chuàng)建對象時,修改person2的年齡實(shí)質(zhì)上是修改了該對象所在內(nèi)存空間的年齡。因此,person1的年齡也被修改了。而使用clone方式則是復(fù)制了一個新的內(nèi)存空間,因此person3的年齡與person1互不影響。