<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Cloneable是標記型的介面(空介面),它們內部都沒有方法和屬性,實現 Cloneable來表示該物件能被克隆,能使用Object.clone()方法。如果沒有實現 Cloneable的類物件呼叫clone()就會丟擲CloneNotSupportedException異常。
可以理解為Cloneable介面發揮的是標記功能,自定義型別需要使用者自己標記出哪些類是可以clone的,這個標記就是去實現Cloneable介面,實現了Cloneable介面後就表明該類建立的物件可以被克隆。
而要想使一個類具備拷貝範例的功能,除了要實現Cloneable介面,還必須重寫Object類的clone()方法。
可以看到Object類的clone()方法是被protected修飾的,所以需要在重寫的clone()方法中通過super關鍵字去呼叫Object類中的clone()方法
在拷貝一個物件時,對 物件的基本資料型別的成員變數進行拷貝,但對參照型別的成員變數只進行參照的傳遞,並沒有建立一個新的物件,當對參照型別的內容修改會影響被拷貝的物件。簡而言之:淺拷貝僅僅複製所拷貝的物件,而不復制它所參照的物件。
觀察下面的程式碼,將Money類的範例作為了Person類的欄位,new一個Person類的物件person1,將這個person1物件拷貝到person2中,這裡的拷貝就是淺拷貝了,只是將person1物件的money參照拷貝到了person2,person1和person2中的momey指向的是同一個物件。
class Money { public double m = 666; } class Person implements Cloneable{ int id; public Money money = new Money(); public Person(int id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Person{" + "id=" + id + ", money=" + money.m + '}'; } } public class TestDemo3 { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(1); Person person2 = (Person) person1.clone(); System.out.println("通過person2修改前的結果"); System.out.println(person1); System.out.println(person2); person2.money.m = 888; person2.id = 2; System.out.println("通過person2修改後的結果"); System.out.println(person1); System.out.println(person2); } }
執行結果:
淺拷貝圖解:
在拷貝一個物件時,除了對基本資料型別的成員變數進行拷貝,對參照型別的成員變數進行拷貝時,建立一個新的物件來儲存參照型別的成員變數。簡而言之:深拷貝把要複製的物件所參照的物件都複製了一遍。
下面的程式碼實現了深拷貝;實現person1物件的深拷貝,先用Person tmp參照來儲存淺拷貝的結果,通過tmp參照找到money物件,再將money物件拷貝一份,然後賦值給tmp中的money,最後返回tmp即可。這樣就將money參照的物件也拷貝了一份,實現了深拷貝,此時person1和person2中的momey指向的是兩個不同的物件。
class Money implements Cloneable{ public double m = 666; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person implements Cloneable{ public int id; public Money money = new Money(); public Person(int id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException { //return super.clone(); Person tmp = (Person) super.clone(); tmp.money = (Money) this.money.clone(); return tmp; } @Override public String toString() { return "Person{" + "id=" + id + ", money=" + money.m + '}'; } } public class Test2 { public static void main(String[] args) throws CloneNotSupportedException{ Person person1 = new Person(1); Person person2 = (Person) person1.clone(); System.out.println("通過person2修改前的結果"); System.out.println(person1); System.out.println(person2); person2.money.m = 888; person2.id = 2; System.out.println("通過person2修改後的結果"); System.out.println(person1); System.out.println(person2); } }
執行結果:
深拷貝圖解:
java中clone方法是一個淺拷貝,參照型別依然在傳遞參照。我們可以通過繼續呼叫clone()方法,對 該物件的參照型別變數再實現一次clone()的方法來實現深拷貝。
到此這篇關於詳解Java深拷貝,淺拷貝和Cloneable介面的文章就介紹到這了,更多相關Java Cloneable介面內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45