日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 浅拷贝和深拷贝

發布時間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 浅拷贝和深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。