深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用
拷貝總體上分為引用拷貝和對象拷貝。
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中的所有元素,都不是一個地址了。
總結
以上是生活随笔為你收集整理的深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例设计模式详解+源代码+JDK源码应用
- 下一篇: 题意解读+详细题解-Leecode 31