Java 克隆:復制構造函數與克隆

為了實現克隆,我們需要配置我們的類并遵循以下步驟:

在我們的類或其超類或接口中實現 Cloneable 接口。
定義一個應處理 CloneNotSupportedException(拋出或記錄)的 clone() 方法。
并且,在大多數情況下,我們從clone()方法中調用超類的clone()方法。
Java 克隆與復制構造函數
super.clone() 將調用它的 super.clone(),并且鏈將繼續,直到調用到達 Object 類的 clone() 方法,該方法將創建一個字段到我們對象的字段 mem 副本并將其返回。

與一切事物一樣,克隆也有其優點和缺點。然而,Java 克隆因其設計問題而聞名,但它仍然是當今最常見和流行的克隆策略。

Object.clone() 的優點
正如前面提到的,Object.clone() 存在許多設計問題,但它仍然是最流行和最簡單的復制對象的方法。使用clone()的一些優點是:

克隆需要的代碼行少得多——只需一個具有 4 行或 5 行長的 clone() 方法的抽象類,但如果我們需要深度克隆,我們將需要重寫它。
這是復制對象的最簡單方法,特別是當我們將其應用于已經開發的或舊的項目時。我們只需要定義一個父類,在其中實現 Cloneable,提供clone() 方法的定義,就可以了。我們父母的每個孩子都將獲得克隆功能。?
我們應該使用克隆來復制數組,因為這通常是最快的方法。
從版本 1.5 開始,在數組上調用克隆會返回一個數組,其編譯時類型與被克隆的數組的編譯時類型相同,這顯然意味著在數組上調用克隆不需要類型轉換。
Object.clone() 的缺點
以下是導致許多開發人員不使用 Object.clone() 的一些缺點:

使用 Object.clone() 方法需要我們在代碼中添加大量語法,例如實現 Cloneable 接口、定義 Clone() 方法并處理 CloneNotSupportedException,最后調用 Object.clone() 并將其強制轉換到我們的對象上。
Cloneable 接口缺少clone() 方法。實際上,Cloneable是一個標記接口,里面沒有任何方法,我們仍然需要實現它只是為了告訴JVM我們可以對我們的對象執行clone()。
Object.clone() 是受保護的,因此我們必須提供自己的clone() 并從中間接調用Object.clone()。
我們無法控制對象構造,因為 Object.clone() 不會調用任何構造函數。
如果我們在子類(例如Person)中編寫clone方法,那么它的所有超類都應該在其中定義clone()方法或從另一個父類繼承它。否則, super.clone() 鏈將會失敗。
Object.clone() 僅支持淺復制,因此新克隆的對象的引用字段仍將保留原始對象的字段所保留的對象。為了克服這個問題,我們需要在我們的類持有引用的每個類中實現clone(),然后在我們的clone()方法中單獨調用它們的克隆,如下例所示。
我們無法在 Object.clone() 中操作 Final 字段,因為 Final 字段只能通過構造函數更改。在我們的例子中,如果我們希望每個 Person 對象的 id 都是唯一的,那么如果使用 Object.clone(),我們將得到重復的對象,因為 Object.clone() 不會調用構造函數,并且最終的 id 字段不能修改自 Person.clone()。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210818.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu上svn基本使用(gitee提交下載)

目錄 環境準備 1. 獲取代碼到本地 直接獲取 獲取代碼時加入用戶名密碼 指定版本更新 2. 提交代碼 3. 展示代碼列表 4. 添加代碼文件(目錄) 5. 刪除gitee倉庫中的文件 參考文檔鏈接 環境準備 當前操作系統為Ubuntu22.04LTS gitee 創建倉庫時 需要打開svn的支持 sudo…

GoLong的學習之路,進階,微服務之使用,RPC包(包括源碼分析)

今天這篇是接上上篇RPC原理之后這篇是講如何使用go本身自帶的標準庫RPC。這篇篇幅會比較短。重點在于上一章對的補充。 文章目錄 RPC包的概念使用RPC包服務器代碼分析如何實現的?總結Server還提供了兩個注冊服務的方法 客戶端代碼分析如何實現的?如何異步…

nginx配置正向代理支持https

操作系統版本: Alibaba Cloud Linux 3.2104 LTS 64位 nginx版本: nginx-1.25.3 1. 下載軟件 切換目錄 cd /server wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.1解壓 tar -zxvf nginx-1.25.3.tar.gz 1.2切換到源碼所在目錄…

【探索Linux】—— 強大的命令行工具 P.21(多線程 | 線程同步 | 條件變量 | 線程安全)

閱讀導航 引言一、線程同步1. 競態條件的概念2. 線程同步的概念 二、條件變量1. 條件變量函數?使用前提(1)初始化條件變量(2)等待條件滿足(3)喚醒等待pthread_cond_broadcast()pthread_cond_signal() &…

JavaGUI詳解

GUI Java GUI**1、Java GUI 概述****2、容器****2、1 窗口****2、2 彈窗和對話框****對話框****自定義彈窗** **2、3 面板****普通面板****滾動面板****分隔面板****選項卡面板** **3、布局****3.1、流式布局****3.2、網格布局****3.3、邊框布局****4、組件****4.1、基本組件**…

Steampipe的安裝部署及簡單使用(附帶AWS CLI的安裝與使用)

介紹 Steampipe 將 API 和服務公開為高性能關系數據庫,使您能夠編寫基于 SQL 的查詢來探索動態數據。Mods 通過使用簡單 HCL 構建的儀表板、報告和控件擴展了 Steampipe 的功能。 官網:https://steampipe.io/ steampipe的安裝 下載腳本并執行 sudo /…

Unity優化——批處理的優勢

大家好,這里是七七,前段時間在忙一些事情,最近終于有空來更新優化篇了。本文本打算分為上下兩篇,但為了看更方便,就多花了幾天寫成一文發布,具體是介紹了圖形優化中批處理的具體效果,雖然本文篇…

【Linux】cat 命令使用

cat 命令 cat(英文全拼:concatenate)命令用于連接文件并打印到標準輸出設備上。 可以使用cat連接多個文件、創建新文件、將內容附加到現有文件、查看文件內容以及重定向終端或文件中的輸出。 cat可用于在不同選項的幫助下格式化文件的輸出…

LV.13 D1 嵌入式系統移植導學 學習筆記

一、嵌入式系統分層 操作系統:向下管理硬件、向上提供接口 操作系統為我們提供了: 1.進程管理 2.內存管理 3.網絡接口 4.文件系統 5.設備管理 那系統移植是干什么呢? 就是將Linux操作系統移植到基于ARM處理器的開發板中。 那為什么要移植系…

【calcitonin ; 降鈣素 ;降鈣素原】

Parathyroid_Hormone -甲狀旁腺激素 PTH ; 特立帕肽;

『OPEN3D』1.8.2 全局ICP配準

前文提到的多種icp方式均需要初始的變換函數作為配準過程的初始值,并在該初始值上進行迭代優化得到結果;那么global icp為前面這些精配準的icp提供了初始變換函數。因此global ICP配準后可視化的點云結果可能沒有完全配準,需要再進行一次精配準操作。 global icp需要對點云提…

lightdb plorasql集合類型新增可變數組

文章目錄 背景集合類型可變數組可變數組示例 背景 在信創適配中,從Oracle遷移過來的存儲過程使用到可變數組。因此在LightDB-X 23.4版本中對現有的集合類型進行了增強,添加了可變數組類型。 集合類型 在LightDB-X 23.4版本開始plorasql支持的集合類型…

【SQL開發實戰技巧】系列(四十八):Oracle12C常用新特性?多分區操作和管理

系列文章目錄 【SQL開發實戰技巧】系列(一):關于SQL不得不說的那些事 【SQL開發實戰技巧】系列(二):簡單單表查詢 【SQL開發實戰技巧】系列(三):SQL排序的那些事 【SQL開發實戰技巧…

K8s構建的mysql無法遠程連接

最近在寫一個老師布置的大作業,都是老師寫好的yaml文件,都是沒問題的,但是構建的mysql無法遠程連接。 嘗試了網上的很多方法,都失敗了,我的構建過程應該是沒什么錯誤的,所以網上的方法并不奏效&#xff0c…

【小白專用】Sql Server 連接Mysql 更新23.12.09

目標 已知mysql連接參數(地址和用戶),期望通過Microsoft Sql Server Management Studio (以下簡稱MSSSMS)連接Mysql,在MSSSMS中直接查詢或修改Mysql中的數據。 一般是選最新的版本下載。 選64位還是32位&a…

C++ 對象的初始化和清理:構造函數和析構函數

目錄 構造函數和析構函數 構造函數 析構函數 構造函數的分類及調用 括號法 顯示法 隱式轉換法 拷貝構造函數的調用時機 使用一個已經創建完畢的對象來初始化一個新對象 值傳遞的方式給函數參數傳值 以值方式返回局部對象 構造函數調用規則 初始化列表 類對象作…

【Java 基礎】27 XML 解析

文章目錄 1.SAX 解析器1)什么是 SAX2)SAX 工作流程初始化實現事件處理類解析 3)示例代碼 2.DOM 解析器1)什么是 DOM2)DOM 工作流程初始化解析 XML 文檔操作 DOM 樹 3)示例代碼 總結 在項目開發中&#xff0…

Jupyter notebook修改背景主題

打開Anaconda Prompt,輸入以下內容 1. pip install --upgrade jupyterthemes 下載對應背景主題包 出現Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1時,說明已經下載安裝完成 2. jt -l 查看背景主題列表 3. jt -t 主題名稱(…

【LeeCode】18.四數之和

給你一個由 n 個整數組成的數組 nums &#xff0c;和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若兩個四元組元素一一對應&#xff0c;則認為兩個四元組重復&#xff09;&#xff1a; 0 < a, …

mysql的BIT數值類型

MySQL :: MySQL 8.2 Reference Manual :: 11.1.5 Bit-Value Type - BIT MySQL :: MySQL 8.2 Reference Manual :: 9.1.5 Bit-Value Literals BIT類型用來存放bit值&#xff0c;每一位是0或者1&#xff0c;允許1-64位。 例如&#xff0c;下面表定義了new這列的類型為8位的BIT…