点击上方 Java后端,选择设为星标

作者 | 张纪刚
链接 | blog.csdn.net/zhangjg_blog
clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。
我们回顾一下:在java语言中,有几种方式可以创建对象呢?
1. 使用new操作符创建一个对象
2. 使用clone方法复制一个对象
复制对象 or 复制引用
Person p = new Person(23, "zhang");Person p1 = p;System.out.println(p);System.out.println(p1);
com.pansoft.zhangjg.testclone.Person@2f9ee1accom.pansoft.zhangjg.testclone.Person@2f9ee1ac
而已,他们都指向了一个相同的对象Person(23, "zhang") 。可以把这种现象叫做 引用的复制 。

Person p = new Person(23, "zhang");Person p1 = (Person) p.clone();System.out.println(p);System.out.println(p1);
com.pansoft.zhangjg.testclone.Person@2f9ee1accom.pansoft.zhangjg.testclone.Person@67f1fba0

深拷贝 or 浅拷贝
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;}protected Object clone() throws CloneNotSupportedException {return (Person)super.clone();}}

Person p = new Person(23, "zhang");Person p1 = (Person) p.clone();String result = p.getName() == p1.getName()? "clone是浅拷贝的" : "clone是深拷贝的";System.out.println(result);
clone是浅拷贝的
static class Body implements Cloneable{public Head head;public Body() {}public Body(Head head) {this.head = head;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}static class Head /*implements Cloneable*/{public Face face;public Head() {}public Head(Face face){this.face = face;}}public static void main(String[] args) throws CloneNotSupportedException {Body body = new Body(new Head());Body body1 = (Body) body.clone();System.out.println("body == body1 : " + (body == body1) );System.out.println("body.head == body1.head : " + (body.head == body1.head));}
body == body1 : falsebody.head == body1.head : true
static class Body implements Cloneable{public Head head;public Body() {}public Body(Head head) {this.head = head;}protected Object clone() throws CloneNotSupportedException {Body newBody = (Body) super.clone();newBody.head = (Head) head.clone();return newBody;}}static class Head implements Cloneable{public Face face;public Head() {}public Head(Face face){this.face = face;}protected Object clone() throws CloneNotSupportedException {return super.clone();}}public static void main(String[] args) throws CloneNotSupportedException {Body body = new Body(new Head());Body body1 = (Body) body.clone();System.out.println("body == body1 : " + (body == body1) );System.out.println("body.head == body1.head : " + (body.head == body1.head));}
body == body1 : falsebody.head == body1.head : false
真的是深拷贝吗
讲解我们已经知道:如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个被引用的对象必须也要实现Cloneable接口并且实现clone方法。微信搜索 web_resource 获取更多推送。
static class Body implements Cloneable{public Head head;public Body() {}public Body(Head head) {this.head = head;}protected Object clone() throws CloneNotSupportedException {Body newBody = (Body) super.clone();newBody.head = (Head) head.clone();return newBody;}}static class Head implements Cloneable{public Face face;public Head() {}public Head(Face face){this.face = face;}protected Object clone() throws CloneNotSupportedException {return super.clone();}}static class Face{}public static void main(String[] args) throws CloneNotSupportedException {Body body = new Body(new Head(new Face()));Body body1 = (Body) body.clone();System.out.println("body == body1 : " + (body == body1) );System.out.println("body.head == body1.head : " + (body.head == body1.head));System.out.println("body.head.face == body1.head.face : " + (body.head.face == body1.head.face));}
body == body1 : falsebody.head == body1.head : falsebody.head.face == body1.head.face : true

如何进行彻底的深拷贝
static class Head implements Cloneable{public Face face;public Head() {}public Head(Face face){this.face = face;}protected Object clone() throws CloneNotSupportedException {//return super.clone();Head newHead = (Head) super.clone();newHead.face = (Face) this.face.clone();return newHead;}}static class Face implements Cloneable{protected Object clone() throws CloneNotSupportedException {return super.clone();}}
body == body1 : falsebody.head == body1.head : falsebody.head.face == body1.head.face : false


写在最后

荐
阅
读

在看

本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
相关文章
暂无评论...
