深复制,浅复制和 Java Clone 方法

对于C语言,简单的来说就是,在有指针的情况下,浅复制只是增加了一个指针指向已经存在的内存,而深复制就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。

由于浅复制是多个指针指向同一块内存,在释放内存的时候不小心会出现重复释放同一块内存的错误,而采用深复制则不会出现这种情况。

对于Java语言,简单的来说就是,浅复制是指复制对象时仅仅复制对象本身,而不复制对象中包含的引用类型指向的对象;深复制不仅复制对象本身,而且复制对象包含的引用所指向的对象。

下面例举一个Java的例子:

public class UselessClass {

	public static void main(String[] args) throws Exception {
		Husband husband1 = new Husband("汪峰",new Wife("章子怡"));
		//浅复制一个husband
		Husband husband2 = (Husband) husband1.clone();
		
		husband2.name = "马云";
		husband2.wife.name = "张瑛";
		
		System.out.println("丈夫的名字是:" + husband1.name + "	妻子的名字是:" + husband1.wife.name);
	}

}

class Wife implements Cloneable {
	public String name;

	public Wife(String name) {
		this.name = name;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

class Husband implements Cloneable {
	public String name;
	public Wife wife;
	
	public Husband(String name, Wife wife) {
		this.name = name;
		this.wife = wife;
	}

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

上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:张瑛

从上面的例子我们可以看出,当我们修改husband2名字的时候,husband1的名字并没有改变。然而,修改husband2妻子名字的时候,husband1的妻子的名字却发生了改变,这足以证明浅复制仅仅复制了对象本身,而不复制对象中包含的引用类型指向的对象。

如果想要深复制,则把上面Husband中的clone方法做如下更改:

@Override
	protected Object clone() throws CloneNotSupportedException {
		Husband husband = (Husband) super.clone();
		husband.wife = (Wife) wife.clone();
		
		return husband;
	}

上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:章子怡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值