浅克隆与深克隆的区别及特点

浅克隆与深克隆的区别

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:"+

你可能感兴趣的:(经验结论,java,面试,程序人生,经验分享)