目录
浅克隆和深克隆
克隆的定义:
对像的复制
浅克隆的定义:
浅克隆指的是单纯地对对象进行低层次的复制,“低”主要体现在在复制对象时,对象中的引用没有重新开辟空间,而是将新的引用指向原来的的内容。
深克隆的定义:
深克隆指的是对对象进行彻底的复制,对所有引用重新开辟空间,复制产生的对象完全独立于原对象,两者没有任何联系,互不影响。
浅克隆和深克隆的区别:
是否对所有引用数据成员开辟新的堆区空间,以具体的Person对象per1克隆为例:
Person类的UML图和内存分布图
现有一个Person对象per1,其内存分布如下图:
现对其进行浅克隆和深克隆
浅克隆内存分布:
复制后的对象命名为per2
根据内存分布可见per1和per2共用一个head,head没有被复制(更不用谈head中的引用brainstem了)。浅克隆只是将per2中的引用指向了内存中原来的head,通过per1或per2对head进行修改都会修改"对方中的head“的值.
深克隆内存分布:
复制后的对象命名为per2
根据内存分布图可见per2对per1的复制不仅head开辟了新的空间,同时它的二级引用brainstem也开辟了新的空间。深克隆保证了克隆后的对象完全独立于原对象,两者不会相互影响。如:对per1的head进行修改不会修改per2中的head的值。
浅克隆代码:
public class tests {
public static void main(String[] args) throws CloneNotSupportedException {
person p1 = new person("我头上有犄角", new head("per1的头", new brainstem("per1的脑干")));
person p2 = (person) p1.clone();
System.out.println("修改前");
p1.printInfo();
p2.printInfo();
p2.name = "我身后有尾巴";
p2.h.name = "per2的头";
p2.h.brain.name = "per2的脑干";
System.out.println("修改后");
p1.printInfo();
p2.printInfo();
}
}
class brainstem {
String name;
public brainstem(String name) {
this.name = name;
}
}
class head {
String name;
brainstem brain;
public head(String name, brainstem brain) {
this.name = name;
this.brain = brain;
}
}
class person implements Cloneable {
String name;
head h;
public person(String name, head day) {
this.name = name;
this.h = day;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void printInfo() {
System.out.println(this.name+" "+this.h.name+" "+this.h.brain.name);
}
}
运行结果:
修改per2导致per1和per2中的值都被修改了
深克隆代码:
public class test {
public static void main(String[] args) throws CloneNotSupportedException {
person p1 = new person("我头上有犄角", new head("per1的头", new brainstem("per1的脑干")));
person p2 = (person) p1.clone();
System.out.println("修改前");
p1.printInfo();
p2.printInfo();
p2.name = "我身后有尾巴";
p2.h.name = "per2的头";
p2.h.brain.name = "per2的脑干";
System.out.println("修改后");
p1.printInfo();
p2.printInfo();
}
}
class brainstem implements Cloneable {
String name;
public brainstem(String name) {
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class head implements Cloneable {
String name;
brainstem brain;
public head(String name, brainstem brain) {
this.name = name;
this.brain = brain;
}
public Object clone() throws CloneNotSupportedException {
head temp = (head) super.clone();
temp.brain = (brainstem) this.brain.clone();
return temp;
}
}
class person implements Cloneable {
String name;
head h;
public person(String name, head day) {
this.name = name;
this.h = day;
}
public Object clone() throws CloneNotSupportedException {
person temp = (person) super.clone();
temp.h = (head) this.h.clone();
return temp;
}
public void printInfo() {
System.out.println(this.name+" "+this.h.name+" "+this.h.brain.name);
}
}