中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中淺復制和深復制的區別是什么

發布時間:2020-06-24 09:11:39 來源:億速云 閱讀:425 作者:Leah 欄目:編程語言

Java中淺復制和深復制的區別是什么?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

將一個對象的引用復制給另一個對象,一共有三種方式。第一種方式是直接賦值,第二種方式是淺復制,第三種方式是深復制。

1.直接賦值

在Java中,A a1 = a2,這實際上復制的是引用,也就是說 a1 和 a2指向的是同一個對象。因此,當a1變化時,a2里面的成員變量也會跟著變化。

2.淺復制(復制引用但不復制引用的對象)

淺復制,又稱為淺拷貝。創建一個新對象,然后將當前對象非靜態字段復制到該新對象,如果字段是值類型的,那么對該字段執行復制;如果該字段時引用類型的話,則復制引用但不復制引用的對象。因此,原始對象及其副本引用同一個對象。

class Resume implements Cloneable{ 
     public Object clone() { 
         try { 
             return (Resume)super.clone(); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         return null; 
         } 
     } 
}

3.深復制(復制對象和其引用對象)

又稱深拷貝,不僅復制對象本身,而且復制對象包含的引用指向的所有對象。

class Student implements Cloneable {
         String name;
         int age;
         Professor p;
     Student(String name, int age, Professor p) {
         this.name = name;
         this.age = age;
         this.p = p;
     }
     public Object clone() {
         Student o = null;
         try {
             o = (Student) super.clone();
         } catch (CloneNotSupportedException e) {
             System.out.println(e.toString());
         }
     o.p = (Professor) p.clone();
     return o;
     }
}

使用clone()方法克隆一個對象的步驟:

1)被克隆的類要實現Cloneable接口。

2)被克隆的類要重寫clone()方法。

那么在編程時,如何選擇使用哪種復制方式呢?首先,檢查類有無非基本類型(即對象)的數據成員。若沒有,則返回super.clone()即可。若有,確保類中包含的所有非基本類型的成員變量都實現了深復制。

引申:淺復制與深復制的區別?

淺復制(Shallow Clone):被復制的對象的所有變量都含有與原來對象相同的值,而所有其他對象的引用仍然指向原來的對象。換而言之,淺復制僅僅復制所考慮的對象,而不復制它引用的對象。

深復制(Deep Clone):被復制對象的所有變量都含有與原來對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制的新對象,而不是原有的那些被引用的對象。換而言之,深復制把復制的對象所引用的對象都復制了一遍。

擴展:

原型模式主要用于對象的復制,實現了接口(實現Cloneable接口),重寫一個方法(重寫Object類中的clone()方法),即完成了原型模式。

原型模式中的拷貝分為“淺拷貝”和“深拷貝”:

淺拷貝:對值類型的成員變量進行值的復制,對引用類型得成員變量只復制引用,不復制引用的對象。

拷貝:對值類型的成員變量進行值的復制,對引用類型的成員變量也進行引用對象的復制。

(Object類的clone方法只會拷貝對象中的基本數據類型的值,對于數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的數組、容器對象、引用對象等另行拷貝。)

原型模式的優點:

1.如果創建新的對象比較復雜時,可以利用原型模式簡化對象的創建過程。

2.是永遠是模式創建對象比直接new一個對象在性能上要好得多,因為Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是復制大對象時,性能的差別非常明顯。

原型模式的使用場景:

因為以上優點,所以在需要重復地創建相似對象時可以考慮使用原型模式。比如需要在一個循環體內創建對象,假如對象創建過程比較復雜或者循環次數很多的話,使用原型模式不但可以簡化創建過程,而且可以使系統的整體性能提高很多。

看完上述內容,你們對Java中淺復制和深復制的區別有進一步的了解嗎?如果還想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

韶关市| 唐海县| 松阳县| 临澧县| 衡阳县| 漯河市| 蒙阴县| 东乌| 炉霍县| 水富县| 兰溪市| 宜兰市| 金山区| 理塘县| 承德市| 江陵县| 美姑县| 安顺市| 陆丰市| 遂溪县| 盐亭县| 岑溪市| 庆城县| 东方市| 吉首市| 平度市| 金坛市| 邮箱| 忻城县| 巩义市| 齐齐哈尔市| 高清| 西贡区| 蕉岭县| 黎城县| 白朗县| 淮北市| 万州区| 铅山县| 荣昌县| 保山市|