java Clone接口和深拷貝詳解
對于數(shù)組的拷貝,如果是簡單類型的話是深拷貝,如果是引用類型的話是淺拷貝,但是因為java是面向?qū)ο蟮模诨卮鹈嬖嚬賳栴}的時候,我們可以不用說的這么細,可以直接說淺拷貝。
代碼示例1
class Person implements Cloneable{//如果想克隆自定義類,那么需要在自定義類上實現(xiàn)Cloneable接口 public int age; /*疑問:為什么這個接口是空接口呢?這是一個面試問題。 空節(jié)課:也把它叫做標(biāo)記接口。其實就是這個意思:只要一個類實現(xiàn)了這個接口,那么就標(biāo)記這個類是可以進行clone的 * * 2:重寫clone方法*/ @Override protected Object clone() throws CloneNotSupportedException {//重寫了父類的克隆方法 return super.clone(); } } public class TestDemo { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); Person person2 = (Person) person1.clone(); System.out.println(person1.age); System.out.println(person2.age); System.out.println("=======修改======="); person2.age = 99; System.out.println(person1.age); System.out.println(person2.age); } /*public static void main(String[] args) { int[] array = {1,2,3,4,5,6}; int[] array2 = array.clone();//對這個數(shù)組進行克隆 array2[0] = 33;//改變拷貝后的數(shù)組元素的值不會影響原來數(shù)組的元素,這種情況是深拷貝 System.out.println(Arrays.toString(array2)); System.out.println(Arrays.toString(array)); }*/ }
輸出為:
因為改變的是簡單類型,所以這種情況是深拷貝。
代碼示例2
class Money{ double money = 12.5; } class Person implements Cloneable{//如果想克隆自定義類,那么需要在自定義類上實現(xiàn)Cloneable接口 public int age; /*疑問:為什么這個接口是空接口呢?這是一個面試問題。 空節(jié)課:也把它叫做標(biāo)記接口。其實就是這個意思:只要一個類實現(xiàn)了這個接口,那么就標(biāo)記這個類是可以進行clone的 * * 2:重寫clone方法*/ Money m = new Money(); @Override protected Object clone() throws CloneNotSupportedException {//重寫了父類的克隆方法 return super.clone(); } } public class TestDemo { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); Person person2 = (Person) person1.clone(); System.out.println(person1.m.money); System.out.println(person2.m.money); System.out.println("=========修改=========="); person2.m.money = 99.9; System.out.println(person1.m.money); System.out.println(person2.m.money); } }
輸出為:
可以參考以下圖分析:
這種情況就是淺拷貝,那么可以將這個淺拷貝變成深拷貝嗎?只需要將Money也克隆一下
class Money implements Cloneable{//如果想要變成深拷貝的話,那么money也需要被克隆。 double money = 12.5; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person implements Cloneable{//如果想克隆自定義類,那么需要在自定義類上實現(xiàn)Cloneable接口 public int age; Money m = new Money(); @Override protected Object clone() throws CloneNotSupportedException {//重寫了父類的克隆方法 Person p = (Person)super.clone();//1:將當(dāng)前的對象克隆一份,克隆person p.m = (Money) this.m.clone();//2:克隆當(dāng)前的Money對象 return p; } } public class TestDemo { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); Person person2 = (Person) person1.clone(); System.out.println(person1.m.money); System.out.println(person2.m.money); System.out.println("=========修改=========="); person2.m.money = 99.9; System.out.println(person1.m.money); System.out.println(person2.m.money); } }
這樣就就將淺拷貝轉(zhuǎn)變成了深拷貝,可以參考以下圖分析:
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié)
MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié),需要的朋友可以參考下2017-02-02java 裝飾模式(Decorator Pattern)詳解及實例代碼
裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝2016-10-10springcloud項目里application.yml不加載的坑及解決
這篇文章主要介紹了springcloud項目里application.yml不加載的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)遞歸之迷宮回溯案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08Java實現(xiàn)HttpGet請求傳body參數(shù)
這篇文章主要為大家詳細介紹了Java實現(xiàn)HttpGet請求傳body參數(shù)的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Java數(shù)據(jù)結(jié)構(gòu)與算法之循環(huán)隊列的實現(xiàn)
循環(huán)隊列 (Circular Queue) 是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細了解循環(huán)隊列如何實現(xiàn),需要的朋友可以參考一下2021-12-12