java数组深拷贝和浅拷贝_java 浅拷贝和深拷贝

实现拷贝有几点:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值