通过一个实例对象 生成另一个对象,称为 拷贝。
需要 实现
java.lang.Cloneable
该接口是一个 标记接口
通过调用 clone() 方法,完成 对象拷贝。该方法是Object类中的方法,所有对象都继承该方法。
clone()方法是 浅拷贝,也就是 只 将 对象 中的 字段 值 进行复制:
1. 如果值 是 基本类型,那么就是 copy 一份 该值
2. 如果值 是 引用类型,那么就是 copy一份该引用,那么,此时,新对象和老对象 都持有 该引用,其中一方修改改引用对象的数据,另一方也是拿到最新修改的值。
3. clone 方法 不会调用 构造函数
public class CloneTest implements Cloneable {
private Cat cat;
private String name;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CloneTest(Cat cat, String name) {
this.cat = cat;
this.name = name;
System.out.println("CloneTest构造函数");
}
public static void main(String[] args) throws Exception{
Cat ori_cat = new Cat("ori cat");
CloneTest cloneTest = new CloneTest(ori_cat, "ori-clonetest");
CloneTest clone = (CloneTest)cloneTest.clone();
clone.getCat().setName("clone cat");
System.out.println(cloneTest.getCat().getName());
}
}
我们经常用的 BeanUtils进行对象属性copy,也是浅拷贝
org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object)
Cat ori_cat = new Cat("ori cat");
OriClass ori_class = new OriClass("ori class", ori_cat);
TarClass tarClass = new TarClass();
BeanUtils.copyProperties(ori_class,tarClass);