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是浅拷贝的