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;}@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的職業類public?String?name;@Overrideprotected?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://blog.51cto.com/11083953/1746225
總結
以上是生活随笔為你收集整理的java 浅拷贝和深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC之ActionFilterAttr
- 下一篇: 【学习笔记】观察者模式