java 浅拷贝和深拷贝
實(shí)現(xiàn)拷貝有幾點(diǎn):
1)實(shí)現(xiàn)Cloneable接口
2)重寫(xiě)Object類(lèi)中的clone方法,并將可見(jiàn)性從protect改為public
3)克隆需要調(diào)用super.clone(),也就是Object的實(shí)現(xiàn)方法
淺拷貝和深拷貝的區(qū)別:
????淺拷貝是指拷貝對(duì)象時(shí)僅僅拷貝對(duì)象本身(包括對(duì)象中的基本變量),而不拷貝對(duì)象包含的引用指向的對(duì)象。
????深拷貝不僅拷貝對(duì)象本身,而且拷貝對(duì)象包含的引用指向的所有對(duì)象。
以下代碼說(shuō)明了淺拷貝的特征:
/***?@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;}@Overrideprotected?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的職業(yè)類(lèi)public?String?name;@Overrideprotected?Object?clone()?throws?CloneNotSupportedException?{return?super.clone();} }測(cè)試類(lèi):
/***?@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[]{"數(shù)組內(nèi)容"};personChina.vocation?=?new?vocation();personChina.vocation.name?="職業(yè)";personChina?personCopy?=?(personChina)?personChina.clone();personCopy.vocation.name?=?"職業(yè)Copy";?//拷貝后的person修改了職業(yè)名字System.out.println("拷貝前引用數(shù)據(jù)類(lèi)型:?"?+?personChina.vocation.name);System.out.println("拷貝后string:?"?+?personCopy.name);System.out.println("拷貝后數(shù)組:?"?+?personCopy.array[0]);System.out.println("拷貝后引用數(shù)據(jù)類(lèi)型:?"?+?personCopy.vocation.name);} }注意①處,注釋后,personChina中的vocation屬性并沒(méi)實(shí)現(xiàn)克隆,運(yùn)行結(jié)果: ??
????拷貝前引用數(shù)據(jù)類(lèi)型: 職業(yè)Copy
????拷貝后string: 張三
????拷貝后數(shù)組: 數(shù)組內(nèi)容
????拷貝后引用數(shù)據(jù)類(lèi)型: 職業(yè)Copy
由運(yùn)行結(jié)果可見(jiàn): 注釋掉①處內(nèi)容,就是淺拷貝,只能拷貝基本數(shù)據(jù)類(lèi)型和字符串以及數(shù)組,無(wú)法拷貝其他引用數(shù)據(jù)類(lèi)型,職業(yè)內(nèi)容 前后一致,拷貝后的對(duì)象修改了職業(yè),與此同時(shí),拷貝前的職業(yè)也隨之被改變.
去掉①處的注釋,在personChina類(lèi)克隆的時(shí)候也同時(shí)將其屬性vacation一起進(jìn)行了克隆,由此實(shí)現(xiàn)深拷貝
再次運(yùn)行程序,結(jié)果變?yōu)??
????拷貝前引用數(shù)據(jù)類(lèi)型: 職業(yè)
????拷貝后string: 張三
????拷貝后數(shù)組: 數(shù)組內(nèi)容
????拷貝后引用數(shù)據(jù)類(lèi)型: 職業(yè)Copy
拷貝前后,職業(yè)相互獨(dú)立,拷貝后的對(duì)象只改變了自己的職業(yè)屬性.
由此可見(jiàn),淺拷貝前后的引用類(lèi)型的屬性還是同一個(gè)對(duì)象,而深拷貝則連同引用類(lèi)型的屬性也一并拷貝了一份,跟拷貝前的同一屬性相互獨(dú)立.
????
轉(zhuǎn)載于:https://blog.51cto.com/11083953/1746225
總結(jié)
以上是生活随笔為你收集整理的java 浅拷贝和深拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MVC之ActionFilterAttr
- 下一篇: 【学习笔记】观察者模式