前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口Cloneable浅复制和深复制

接口Cloneable浅复制和深复制

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-25 15:47:56
5130
发布2019-01-25 15:47:56
举报

浅复制shallow copy,指在复制源对象中,如果某个成员数据是一个对象(除了String和所有包装类对象之外),clone()方法只是复制对这个成员对象的引用。即在复制后的对象中,它所具有的成员对象,只是对原来成员对象的引用,并没有真正复制这个成员数据。但对所有基本类型成员数据,包括字符串以及包装类成员对象,clone()则执行真正复制。即分配内存地址,并将它们拷贝到这个内存中。

浅复制的对象对其成员对象的任何修改,实际上是对源对象中成员对象的修改;反之亦然。但对这两个对象中其他类型成员数据的修改,则不会相互影响,因为这些成员数据有其自己独立的拷贝。

示例如下:

代码语言:javascript
复制
public class OtherClass {
	String name;
	public OtherClass(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "OtherClass [name=" + name + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
代码语言:javascript
复制
public class SomeClass implements Cloneable{
	OtherClass other;
	Integer number;
	int n;
	public SomeClass(String title, Integer number, int n) {
		other = new OtherClass(title);
		this.number = number;
		this.n = n;
	}
	public String getTitle() {
		return other.getName();
	}
	public void setTitle(String title) {
		this.other.name = title;
	}
	public Integer getNumber() {
		return number;
	}
	public void setNumber(Integer number) {
		this.number = number;
	}
	public int getN() {
		return n;
	}
	public void setN(int n) {
		this.n = n;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	@Override
	public String toString() {
		return "SomeClass [title=" + other.name + ", number=" + number + ", n=" + n
				+ "]";
	}
}
代码语言:javascript
复制
public class CloneableTest {
	public static void main(String[] args) throws CloneNotSupportedException {
		SomeClass sourceObj = new SomeClass("Java", 100, 10);
		SomeClass targetObj = (SomeClass) sourceObj.clone();
		System.out.println("Content of sorceObj:" + sourceObj);
		System.out.println("Content of targetObj:" + targetObj);
		
		targetObj.setTitle("JSP");
		sourceObj.setNumber(200);
		sourceObj.setN(0);
		System.out.println("After modify...");
		System.out.println("Content of sorceObj:" + sourceObj);
		System.out.println("Content of targetObj:" + targetObj);
	}
}

输出结果为:

代码语言:javascript
复制
Content of sorceObj:SomeClass [title=Java, number=100, n=10]
Content of targetObj:SomeClass [title=Java, number=100, n=10]
After modify...
Content of sorceObj:SomeClass [title=JSP, number=200, n=0]
Content of targetObj:SomeClass [title=JSP, number=100, n=10]

可以看到,clone()方法对sourceObj对象中的成员对象other仅复制引用。所以targetObj对other的修改,即是对sourceObj的修改,反之亦然。当代码中利用sourceObj修改包装类成员number和基本数据类型n时,并不影响targetObj所对应的这些数据成员的值。

覆盖clone()方法,提供对成员对象真正复制的代码,则可以实现深复制。

修改clone()方法如下:

代码语言:javascript
复制
protected Object clone() throws CloneNotSupportedException {
		SomeClass someClass = new SomeClass(this);
		return someClass;
}

修改SomeClass对象,增加一个拷贝构造函数:

代码语言:javascript
复制
public SomeClass(SomeClass someClass) {
		this.other = new OtherClass(someClass.getTitle());
		this.number = someClass.getNumber();
		this.n = someClass.getN();
}

执行CloneTest,结果如下:

代码语言:javascript
复制
Content of sorceObj:SomeClass [title=Java, number=100, n=10]
Content of targetObj:SomeClass [title=Java, number=100, n=10]
After modify...
Content of sorceObj:SomeClass [title=Java, number=200, n=0]
Content of targetObj:SomeClass [title=JSP, number=100, n=10]
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年12月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档