JAVA 深拷贝和浅拷贝

156 阅读1分钟

1. 基本数据类型(包含String) 都是深拷贝,不存在指针引用

2. 对象的clone() 为浅拷贝

Person p1=new Person();  
p1.setAge(31);  
p1.setName("Peter");   
Person p2=(Person) p1.clone();
System.out.println(p1==p2);//false

此可以认为深拷贝,参数为基本类型

public class Address {
    private String type;
    private String value;
}

public class Person implements Cloneable {
    private Address address;

    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

当参数为非基本类型时,clone只会拷贝Person对象,参数仍指向同一Address地址

浅拷贝:被复制对象的所有值属性都含有与原来对象的相同,而所有的对象引用属性仍然指向原来的对象。

深拷贝:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象。

利用序列化实现深拷贝

clone机制不是强类型的限制,比如实现了Cloneable并没有强制继承链上的对象也实现;也没有强制要求覆盖clone()方法。因此编码过程中比较容易忽略其中一个环节,对于复杂的项目排查就是困难了。

要寻找可靠的,简单的方法,序列化就是一种途径。