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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用

發布時間:2024/2/28 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

拷貝總體上分為引用拷貝和對象拷貝。


1. 引用拷貝

創建一個指向對象的引用變量的拷貝。

public class QuoteCopy {public static void main(String[] args) {// 引用拷貝Teacher teacher = new Teacher();Teacher otherTeacher = teacher;} }class Teacher {private String name;private int age;// 省略get、set方法 }

引用拷貝的結果是:會產生兩個地址相同的對象。(相當于兩個對象共用同一個地址,某一個對象中的屬性值發生改變后,會影響到另一個對象



2. 對象拷貝

創建對象本身的一個副本。

public class ObjectCopy {public static void main(String[] args) throws CloneNotSupportedException {Teacher teacher = new Teacher();Teacher otherTeacher = (Teacher) teacher.clone();} }class Teacher implements Cloneable {private String name;private int age;// 省略get、set方法 }

當Teacher類繼承了Cloneable接口后, 調用clone方法,復制出的對象,就叫做對象拷貝。

對象拷貝的值相同,但地址不同。 相當于在存儲區新開辟一份空間存儲拷貝出來的對象。

深拷貝、淺拷貝都是對象拷貝


a. 淺拷貝

定義:被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。即對象的淺拷貝會對“主”對象進行拷貝,但不會復制主對象里面的對象。”里面的對象“會在原來的對象和它的副本之間共享。

舉例:如果教師類中有姓名屬性、年齡屬性和所教課程對象,那么淺拷貝時,僅僅將姓名和年齡拷貝到新地址,而所教課程對象仍然使用原來的地址。

public class ShallowCopy {public static void main(String[] args) throws CloneNotSupportedException {Teacher teacher = new Teacher();Course course = new Course();teacher.setCourse(course);// 實現淺拷貝Teacher teacher1 = (Teacher) teacher.clone();} }class Teacher implements Cloneable {private String name;private int age;private Course course;// 省略get、set對象 }class Course implements Cloneable {private String name;private int time;// 省略get、set對象 }

結果:teacher和teacher1的course對象地址相同(指向同一個對象),但teacher和teacher1的姓名、年齡所在地址不同。


b. 深拷貝

定義:深拷貝是一個整個獨立的對象拷貝,深拷貝會拷貝所有的屬性,并拷貝屬性指向的動態分配的內存。當對象和它所引用的對象一起拷貝時即發生深拷貝。深拷貝相比于淺拷貝速度較慢并且花銷較大。

總體來說,深拷貝將對象中的所有元素都復制了一份,放入了新的地址。

深拷貝的實現方式是:重寫clone()方法。≈

public class ShallowCopy {public static void main(String[] args) throws CloneNotSupportedException {Teacher teacher = new Teacher();Course course = new Course();teacher.setCourse(course);// 實現淺拷貝Teacher teacher1 = (Teacher) teacher.clone();} }class Teacher implements Cloneable {private String name;private int age;private Course course;// 省略get、set對象// 重寫clone()方法public Object clone() throws CloneNotSupportedException {// 淺復制時:// Object object = super.clone();// return object;// 改為深復制:Teacher teacher = (Teacher) super.clone();// 本來是淺復制,現在將Teacher對象復制一份并重新set進來teacher.setCourse((Course) teacher.getCourse().clone());return teacher;} }class Course implements Cloneable {private String name;private int time;// 省略get、set對象 }

結果: teacher和teacher1中的所有元素,都不是一個地址了。

總結

以上是生活随笔為你收集整理的深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用的全部內容,希望文章能夠幫你解決所遇到的問題。

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