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

java深拷贝和浅拷贝_java数组copyof实现拷贝有几点:1)实现Cloneable接口2)重写Object类中的clone方法,并将可见性从protect改为public3)克隆需要调用super.clone(),也就是Object的实现方法浅拷贝和深拷贝的区别:浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。以下代码说明了浅拷…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

实现拷贝有几点:

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189088.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 四舍五入保留小数点后两位

    java 四舍五入保留小数点后两位方式一:doublef=3.1516;BigDecimalb=newBigDecimal(f);doublef1=b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();输出结果f1为3.15;源码解读:  publicBigDecimalsetScale(intnewScale,introundingMode)//intnewScale为小数点后保留的位数,introundingMode为变量进

    2022年5月21日
    1.2K
  • SpringBoot启动如何加载application.yml配置文件「建议收藏」

    SpringBoot启动如何加载application.yml配置文件「建议收藏」一、前言在spring时代配置文件的加载都是通过web.xml配置加载的,可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件;<context-param>  &

    2025年9月29日
    3
  • 介绍篇 决策引擎环节

    介绍篇 决策引擎环节决策引擎概念简述在我理解上决策引擎类似是一个管道、运输系统,连通整个风控流程,所有的规则和评分卡以及流程都覆盖其中,分配到每一个环节(比如人工),将结果返回给决策引擎,走入下一个流程决策引擎的使用规则决策引擎的分流效果评分卡是内置在决策引擎当中,基于评分卡的分段,评分卡的使用具体参见:评分卡在策略中的使用,进行分流,分流决策的目的是为让好客户以及有借款欲望客户进一步走入下一流程决策引擎…

    2022年6月22日
    37
  • 复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离

    复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离

    2022年4月24日
    65
  • 2020年北京理工大学计算机学硕跨考上岸经验分享「建议收藏」

    2020年北京理工大学计算机学硕跨考上岸经验分享「建议收藏」前言5月20号出了录取名单,终于结束了考研生涯。记录下二年的考研历程和心路历程给自己最后一个圆满的结束,内容可能有些啰嗦。一战北航学硕本科就读于北京某211高校能动专业,只学习过C语言。大约9月份开始正式准备考研,当时头铁,看了下北京计算机实力较强的高校,第一梯队是清华北大,不用想,直接放弃。第二梯队北航、北理。身边的同学都保研或考研去北航,遂选择北航。一战结果:总分300+,数学110+,政治英语好像都是60+,最惨的是专业课60,直接没过复试线。卒~~~数学数学跟的是张宇,初期买了一本高数十八

    2022年6月14日
    53
  • platform_driver_register调用probe

    platform_driver_register调用probekernel_init中do_basic_setup()->driver_init()->platform_bus_init()->…初始化platformbus(虚拟总线)设备向内核注册的时候platform_device_register()->platform_device_add()->…内核把设备挂在虚拟的platformbus下驱动注册的时候platform_dri

    2022年7月12日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号