浅克隆与深克隆的区别
1、浅克隆:对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性(拷贝一份该对象并重新分配内存,即产生了新的对象);但如果被克隆的对象中包含除8中数据类型和String类型外的其他类型的属性,浅克隆并不会克隆这些属性(即不会为这些属性分配内存,而是引用原来对象中的属性)。
2、深克隆:深克隆是在浅克隆的基础上,递归地克隆除8种基本数据类型和String类型外的属性(即为这些属性重新分配内存而非引用原来对象中的属性)
浅克隆与深克隆的特点
1、被克隆的对象的类应实现 Cloneable 接口,并重写 clone() 方法
2、浅克隆中由于除8中数据类型和String类型外的其他类型的属性不会被克隆,因此当通过新对象对这些属性进行修改时,原对象的属性也会同时改变。而深克隆则已经对这些属性重新分配内存,所以当通过新对象对这些属性进行修改时,原对象的属性不会改变。
代码示例
浅克隆:
public class Dog implements Cloneable{
private int id;
private Cat cat;
public Cat getcat() {
return cat;
}
public void setcat(Cat cat) {
this.cat = cat;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Dog(int id) {
this.id = id;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Cat {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat(int id,String name) {
this.id = id;
this.name = name;
}
}
测试类:
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Dog dog = new Dog(1);
Cat cat = new Cat(1,"jin");
dog.setcat(cat);
Dog dog2 = (Dog) dog.clone();
//修改dog2的id
dog2.setId(2);
//修改后与原来的id比较
System.out.println("dogId:"+