Person p = new Person(23, "张三"); Person p1 = p; System.out.println(p); System.out.println(p1);
com.pansoft.zhangjg.testclone.Person@2f9ee1ac com.pansoft.zhangjg.testclone.Person@2f9ee1ac
而下面的代码是真真正正的克隆了一个对象:
Person p = new Person(23, "张三"); Person p1 = (Person) p.clone(); System.out.println(p); System.out.println(p1);
com.pansoft.zhangjg.testclone.Person@2f9ee1ac com.pansoft.zhangjg.testclone.Person@67f1fba0
public class Person implements Cloneable{
private int age ;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public Person() {}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException{
return (Person)super.clone();
}
}
①直接将源对象中的name的引用值拷贝给新对象的name字段;
②根据原Person对象中的name指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的Person对象的name字段。
这两种拷贝方式分别叫做 浅拷贝 和 深拷贝 。
深拷贝和浅拷贝的原理如下图所示:
如果两个Person对象的name的地址值相同, 说明两个对象的name都指向同一个String对象, 也就是浅拷贝, 而如果两个对象的name的地址值不同, 那么就说明指向不同的String对象, 也就是在拷贝Person对象的时候, 同时拷贝了name引用的String对象, 也就是深拷贝。验证代码如下:
Person p = new Person(23,"张三");
Person p1 =(Person)p.clone();
String result = p.getName() == p1.getName() ?
"clone是浅拷贝的":"clone是深拷贝的";
打印结果:
clone是浅拷贝的