Java学习之——深复制与浅复制

对象的创建

要想理解什么是深复制(深拷贝)和浅复制(浅拷贝)我们首先要知道对象是怎么创建的。Java创建对象的方式有两种:

1.使用new关键字来创建对象,2.使用clone方法来复制对象

那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。而clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。


复制对象or复制引用

Person p1 = new Person("zhang",23);
Person p2 = p1;

首先我们来看上面一段代码,其中new Person()是创建了一个真正的对象,p1和p2只是两个对象的引用。通过打印地址可以发现地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。p1和p2只是指向了一个相同的对象的两个不同的引用而已。可以把这种现象叫做引用的复制。内存中的地址情景如图:


要想真正的复制一个对象可以使用clone方法

Person p1 = new Person("zhang",23);
Person p2 = (Person)p1.clone();

以上代码执行后内存中的地址情景如图:


可以看出实现了对一个对象的真正的复制。

深拷贝and浅拷贝

Person类中有两个字段(属性/成员变量),年龄字段很简单是基本数据类型,所以对它的拷贝没有什么疑议,直接将一个4字节的整数值拷贝过来就行。但是name是String类型的, 它只是一个引用, 指向一个真正的String对象,那么对它的拷贝有两种方式: 直接将源对象中的name的引用值拷贝给新对象的name字段, 或者是根据原Person对象中的name指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的Person对象的name字段。这两种拷贝方式分别叫做浅拷贝和深拷贝。深拷贝和浅拷贝的原理如图:

如果只是用Object中默认的clone方法,是浅拷贝的,为了要在clone对象时进行深拷贝, 那么就要Clonable接口,覆盖并实现clone方法,除了调用父类中的clone方法得到新的对象, 还要将该类中的引用变量也clone出来。

Clone的用法和说明

(1)clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
对任何的对象x,都有x.clone() !=x 克隆对象与原对象不是同一个对象
对任何的对象x,都有x.clone().getClass()= =x.getClass()克隆对象与原对象的类型一样
如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

(2)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 在派生类中覆盖基类的clone()方法,并声明为public。 在派生类的clone()方法中,调用super.clone()。 在派生类中实现Cloneable接口。

说明:

(1)为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。

(2)那么clone类为什么还要实现Cloneable接口呢?稍微注意一下,Cloneable接口是不包含任何方法的!其实这个接口仅仅是一个标志,而且这个标志也仅仅是针对Object类中clone()方法的,如果clone类没有实现Cloneable接口,并调用了Object的clone()方法(也就是调用了super.Clone()方法),那么Object的clone()方法就会抛出CloneNotSupportedException异常。

(3)利用串行化也可以实现对对象的深复制

blog.csdn.net/u01151481

jb51.net/article/62909.

深圳SEO优化公司塘坑网站优化软件桂林SEO按天扣费鞍山网站优化按天收费推荐仙桃网站制作设计哪家好盐城阿里店铺运营报价保山企业网站改版兴安盟网站推广推荐桐城百度竞价包年推广推荐泰安网络营销报价洛阳百度标王多少钱延边品牌网站设计公司武威外贸网站建设价格长治百度关键词包年推广价格迁安网站设计多少钱酒泉百度seo公司潮州百姓网标王推广推荐河池网站制作设计公司株洲网站推广系统推荐甘南企业网站设计多少钱昌都关键词排名包年推广价格自贡网站推广工具推荐内江网站推广系统推荐辽源SEO按天计费多少钱深圳seo排名多少钱广元seo网站优化公司哈尔滨建站报价海北英文网站建设公司无锡SEO按效果付费哪家好海南企业网站改版多少钱石家庄百度网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化