Java中關於物件的淺克隆以及深克隆詳解
這篇文章主要介紹了java 物件的克隆的相關資料,這裡對淺克隆和深克隆進行了實例分析需要的朋友可以參考下
java 物件的克隆
一、物件的淺克隆
(1)需要複製類別需要重寫Object類別的clone方法,並且實作Cloneable介面(標識接口,無需實作任何方法)
(2)當需要克隆的對像中維護著另一個引用對象,淺克隆不會克隆另外一個引用對下,而是直接複製維護的另外一個引用對象的位址。
(3)物件的淺克隆也不會呼叫到建構方法。
以下為物件的淺克隆的一個例子:
package com.clone; import java.io.Serializable; /** * Description: * 实现了Cloneable接口,并重写Object类的clone方法。 * * @author lee * */ public class CloneDemo1 implements Cloneable,Serializable{ //该克隆类封装的信息 public int id; public String name; public Address address; /** * Desciption: * 默认构造器 * * */ public CloneDemo1(){} /** * Description: * 初始化id,name的构造器 * * @param id id * @param name 名字 * @param address 地址 * */ public CloneDemo1(int id, String name, Address address){ this.id=id; this.name=name; this.address = address; } /** * Descriptin: * 重写Object类的clone方法。 * if the object's class does not support the Cloneable interface. * Subclasses that override the clone method can also throw this exception * to indicate that an instance cannot be cloned. * * @throws CloneNotSupportedException * */ @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } /** * Description: * 重写toString方法 * * @return "id="+id+", name="+name * */ @Override public String toString(){ return "id="+id+", name="+name+", address:"+address.getAddress(); } /** * Description: * 主方法 * * */ public static void main(String[] args) throws CloneNotSupportedException{ CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京")); //c2 复制了c1的地址,并没有复制整个c1对象 CloneDemo1 c2 = c1; //c3 对象的浅克隆,复制了整个对象 CloneDemo1 c3 = (CloneDemo1)c1.clone(); //当对象c1改变其name或者id的时候,c2也会自动改变。 //因为c2只是复制了c1的地址,并非复制了c1的整个对象。 //相应的c3则不会随着c1改变而改变,意味着c3将c1整个对象克隆一份出来。 //当是,对象的浅克隆不会克隆被克隆对象当中的引用对象。 //因此c1改变其中的Address的引用对象时,c2,c3也会跟着改变。 c1.setName("cc"); c1.address.setAddress("上海"); System.out.println(c1+"\n"+c2+"\n"+c3); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * Description: * 一个封装着地址的类 * * @author lee * */ class Address implements Serializable{ public String address; /** * Description: * 默认构造器 * * */ public Address(){} /** * Description: * 初试化address * * @param address 地址 * */ public Address(String address){ this.address = address; } //address的set和get方法 public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
二、物件的深克隆
就是利用物件的輸入輸出流把物件寫到檔案上,再讀取物件的訊息,這就是物件的深克隆。
由於物件的淺克隆不會複製被複製物件其中的參考對象,而是直接複製其位址。因此,要克隆被克隆物件當中的引用類型則需要物件的深克隆。
而物件的深克隆所使用的物件序列化的輸入輸出。
程式碼如下:
package com.clone; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * Description: * 实现对象的深克隆 * * @author lee * */ public class CloneDemo2 { /** * Description: * 将对象输出到一个文件当中。 * * @param c 需要被写到文件当中的对象。 * */ public static void writeObject(CloneDemo1 c){ ObjectOutputStream out = null; try{ //将对象输出在一个object.txt文件当中 out = new ObjectOutputStream(new FileOutputStream("./object.txt")); out.writeObject(c); }catch(IOException e){ System.out.println("写入对象的时候发生了错误。"); e.printStackTrace(); }finally{ //关闭资源 try{ out.close(); }catch(IOException e){ e.printStackTrace(); } } } /** * Description: * 从文件中读取出一个对象来,并返回。 * * @return c 返回一个对象。 * */ public static CloneDemo1 readObject(){ CloneDemo1 c = null; ObjectInputStream input = null; try{ //从object.txt文件中读取一个对象出来 input = new ObjectInputStream(new FileInputStream("./object.txt")); c = (CloneDemo1)input.readObject(); }catch(IOException | ClassNotFoundException e){ e.printStackTrace(); System.out.println("读取对象的时候发生了错误。"); }finally{ //关闭资源 try{ input.close(); }catch(IOException e){ e.printStackTrace(); } } return c; } /** * Description: * 主方法 * * @throws CloneNotSupportedException * */ public static void main(String[] args) throws CloneNotSupportedException { CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京")); //c2 对象的浅克隆 CloneDemo1 c2 = (CloneDemo1)c1.clone(); //c3对象的深克隆 writeObject(c1); CloneDemo1 c3 = readObject(); //因为对象的深克隆同时也克隆了被克隆对象维护的另外一个对象 //所以,当c1改变其当中的维护的另外一个对象的时候,c3不会随之改变。 //而c2位浅克隆,其维护的另外一个对象只是复制了c1维护的对象的地址,因此会随着c1的改变而改变。 c1.address.setAddress("上海"); System.out.println(c1+"\n"+c2+"\n"+c3); } }
物件的序列化,是需要實作Serializable介面的。
以上是Java中關於物件的淺克隆以及深克隆詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
