java 浅拷贝和深拷贝
2016-03-01 11:00
330 查看
实现拷贝有几点:
1)实现Cloneable接口
2)重写Object类中的clone方法,并将可见性从protect改为public
3)克隆需要调用super.clone(),也就是Object的实现方法
浅拷贝和深拷贝的区别:
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
以下代码说明了浅拷贝的特征:
拷贝前引用数据类型: 职业Copy
拷贝后string: 张三
拷贝后数组: 数组内容
拷贝后引用数据类型: 职业Copy
由运行结果可见: 注释掉①处内容,就是浅拷贝,只能拷贝基本数据类型和字符串以及数组,无法拷贝其他引用数据类型,职业内容 前后一致,拷贝后的对象修改了职业,与此同时,拷贝前的职业也随之被改变.
去掉①处的注释,在personChina类克隆的时候也同时将其属性vacation一起进行了克隆,由此实现深拷贝
再次运行程序,结果变为:
拷贝前引用数据类型: 职业
拷贝后string: 张三
拷贝后数组: 数组内容
拷贝后引用数据类型: 职业Copy
拷贝前后,职业相互独立,拷贝后的对象只改变了自己的职业属性.
由此可见,浅拷贝前后的引用类型的属性还是同一个对象,而深拷贝则连同引用类型的属性也一并拷贝了一份,跟拷贝前的同一属性相互独立.
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
拷贝前后,职业相互独立,拷贝后的对象只改变了自己的职业属性.
由此可见,浅拷贝前后的引用类型的属性还是同一个对象,而深拷贝则连同引用类型的属性也一并拷贝了一份,跟拷贝前的同一属性相互独立.
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序