写作的目的在于表达自己的看法,与各位共同交流,希望发现自己写作中的不足,不断完善自我,当然,我的看法不一定是对的,希望各位用于怀疑,指出其中的不足,希望一同努力。
要理解深层复制和浅层复制,首先需要理解复制是什么?复制即在内存中给对象创建一个本地副本,当对本地副本的内容进行修改时,并不会修改原对象内容。对于深层复制,其生成的本地副本,修改任意对象的属性,都不会对原对象产生更改,但是对于浅层复制,修改对象的某些属性,可能会使原对象发生修改,其中某些属性一般指该对象内部包含的引用。
下面举例说明。有疑惑的地方,还请各位指出
浅层复制
// 人的外貌
public class Looks implements Cloneable{
private String look;
public String getLook() {
return look;
}
public void setLook(String look) {
this.look = look;
}
Looks(String look){
this.look = look;
}
@Override
public String toString(){
return "look"+":"+look;
}
}
public class Person implements Cloneable{
// 外貌
private Looks looks;
// 体重
private Integer weight;
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
public Looks getLooks() {
return looks;
}
public void setLooks(Looks looks) {
this.looks = looks;
}
@Override
public Object clone() throws CloneNotSupportedException {
Object o = super.clone();
return o;
}
@Override
public String toString(){
return "weight"+":"+weight+" "+looks;
}
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person();
person1.setWeight(100);
person1.setLooks(new Looks("漂亮"));
Person person2 = (Person) person1.clone();
System.out.println(person1);
System.out.println(person2);
person1.getLooks().setLook("丑的");
System.out.println(person1);
System.out.println(person2);
}
}
weight:100 look:漂亮
weight:100 look:漂亮
weight:100 look:丑的
weight:100 look:丑的
从执行结果可以看出,在对Person中的Looks属性进行更改时,Person1和Person2的Looks属性都发生了变化,所以对于Person内部的Looks属性并没有进行复制,所以为浅层复制
深层复制:
对Person类的clone()方法重写如下:
@Override
public Object clone() throws CloneNotSupportedException {
Looks looks = new Looks("漂亮");
Person o = (Person) super.clone();
o.looks = (Looks) looks.clone();
return o;
}
再次执行main方法时,执行结果如下:
weight:100 look:漂亮
weight:100 look:漂亮
weight:100 look:丑的
weight:100 look:漂亮
充分说明对Person类中的Look属性也进行了复制,所以称为深层复制