首页 > 编程语言 > 详细

java 浅拷贝和深拷贝

时间:2016-03-01 14:48:41      阅读:240      评论:0      收藏:0      [点我收藏+]

实现拷贝有几点:

1)实现Cloneable接口

2)重写Object类中的clone方法,并将可见性从protect改为public

3)克隆需要调用super.clone(),也就是Object的实现方法

浅拷贝和深拷贝的区别:

    浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。

    深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

以下代码说明了浅拷贝的特征:

/**
 * @author QinGuan
 * @date:2016-2-29 下午04:03:03
 * @version :3.0
 *
 */
package com.cloneTest;

public class personChina implements Cloneable {
	public String name;//浅拷贝
	public int age;//浅拷贝
	public String[] array;//浅拷贝
	public vocation vocation;//需要深拷贝的部分

	public personChina(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	protected Object clone() {
		personChina personChina = null;
		try {
		   personChina =  (personChina) super.clone();
		   //personChina.vocation = (vocation) vocation.clone();①
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return personChina;
	}
}

/**
 * @author QinGuan
 * @date:2016-3-1 上午10:39:40
 * @version :3.0
 *
 */
package com.cloneTest;

public class vocation implements Cloneable{    //person的职业类
	public String name;

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

测试类:

/**
 * @author QinGuan
 * @date:2016-2-29 下午04:09:19
 * @version :3.0
 *
 */
package com.cloneTest;

public class test {
	public static void main(String[] args) throws CloneNotSupportedException {
		personChina personChina = new personChina("张三", 2);
		personChina.array = new String[]{"数组内容"};
		personChina.vocation = new vocation();
		personChina.vocation.name ="职业";
		personChina personCopy = (personChina) personChina.clone();
		personCopy.vocation.name = "职业Copy"; //拷贝后的person修改了职业名字
		System.out.println("拷贝前引用数据类型: " + personChina.vocation.name);
		System.out.println("拷贝后string: " + personCopy.name);
		System.out.println("拷贝后数组: " + personCopy.array[0]);
		System.out.println("拷贝后引用数据类型: " + personCopy.vocation.name);
	}
}

注意①处,注释后,personChina中的vocation属性并没实现克隆,运行结果:   

    拷贝前引用数据类型: 职业Copy

    拷贝后string: 张三

    拷贝后数组: 数组内容

    拷贝后引用数据类型: 职业Copy

由运行结果可见: 注释掉①处内容,就是浅拷贝,只能拷贝基本数据类型和字符串以及数组,无法拷贝其他引用数据类型,职业内容 前后一致,拷贝后的对象修改了职业,与此同时,拷贝前的职业也随之被改变.

去掉①处的注释,在personChina类克隆的时候也同时将其属性vacation一起进行了克隆,由此实现深拷贝

再次运行程序,结果变为: 

    拷贝前引用数据类型: 职业

    拷贝后string: 张三

    拷贝后数组: 数组内容

    拷贝后引用数据类型: 职业Copy

拷贝前后,职业相互独立,拷贝后的对象只改变了自己的职业属性.


由此可见,浅拷贝前后的引用类型的属性还是同一个对象,而深拷贝则连同引用类型的属性也一并拷贝了一份,跟拷贝前的同一属性相互独立.

    


本文出自 “QinGuan” 博客,请务必保留此出处http://11083953.blog.51cto.com/11073953/1746225

java 浅拷贝和深拷贝

原文:http://11083953.blog.51cto.com/11073953/1746225

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!