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()方法。因此编码过程中比较容易忽略其中一个环节,对于复杂的项目排查就是困难了。
要寻找可靠的,简单的方法,序列化就是一种途径。