专栏首页人生得意须尽欢覆盖Object中的clone方法, 实现深复制
原创

覆盖Object中的clone方法, 实现深复制

现在为了要在clone对象时进行深复制, 那么就要Clonable接口,覆盖并实现clone方法,除了调用父类中的clone方法得到新的对象, 还要将该类中的引用变量也clone出来。

public class Test {
	static class Body implements Cloneable {
		public Head head;

		public Body() {
		}

		public Body(Head head) {
			this.head = head;
		}

		@Override
		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;
		}

		@Override
		protected Object clone() throws CloneNotSupportedException {
			return super.clone();
		}
	}

	static class Face implements Cloneable {
		public 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 : false
body.head == body1.head : false

  由此可见, body和body1内的head引用指向了不同的Head对象, 也就是说在clone Body对象的同时, 也复制了它所引用的Head对象, 进行了深复制。但实际上上面代码还不是真正意义上的深复制,可以说是不彻底的深复制。因为在拷贝Head类时,默认执行的是浅复制,也就是说Head中组合的Face对象并不会被复制。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java的clone()方法

    ⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足: ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同...

    好派笔记
  • Java--对象的克隆

    SuperHeroes
  • java对象拷贝

    java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:

    pollyduan
  • java对象拷贝最完全解说 转

    java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:

    stys35
  • 好似你,饼印咁:原型模式、浅拷贝与深拷贝

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。大概意思就是:允许一个对象再创建另外一个可定制的对象,根本无需知道对象创建的细节。其工作原理是通...

    java乐园
  • Java对象的复制四种方式

    1、概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任...

    林老师带你学编程
  • Java对象复制的方法

    在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会...

    用户1205080
  • Java对象的深克隆与浅克隆(对象复制)

    自定义了一个学生类,该类只有一个number字段。 新建了一个学生实例,然后将该值赋值给stu2实例。(Student stu2 = stu1;) 再看看打...

    JavaEdge
  • Java提高篇——对象克隆(复制)

    不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。

    Java团长
  • Java提升篇:对象克隆(复制)

    好好学java
  • Java学习笔记之对象的复制和克隆

    不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。

    Jetpropelledsnake21
  • 深拷贝和浅拷贝的区别是什么,如何实现?

    深拷贝是彻底的拷贝,两对象中所有的成员都是独立的一份,而且,成员对象中的成员对象也是独立一份。

    水货程序员
  • 深入浅出Java中的clone克隆方法,写得太棒了!

    clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空...

    Java技术江湖
  • 深入浅出Java中的clone克隆方法,写得太棒了!

    作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/

    Java技术栈
  • C++核心准则C.130:实现多态类的深拷贝时,虚clone函数要比拷贝构造函数/赋值运算符好

    C.130: For making deep copies of polymorphic classes prefer a virtual clone func...

    面向对象思考
  • 详解Java中的clone方法:原型模式

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创...

    哲洛不闹
  • 详解Java中的clone方法 -- 原型模式

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创...

    用户7886150
  • Java复制 | Java随笔记

    如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

    玖柒的小窝
  • 接口Cloneable浅复制和深复制

    浅复制shallow copy,指在复制源对象中,如果某个成员数据是一个对象(除了String和所有包装类对象之外),clone()方法只是复制对这个成员对象的...

    卡尔曼和玻尔兹曼谁曼

扫码关注云+社区

领取腾讯云代金券