簡體   English   中英

Java:clone()操作調用super.clone()

[英]Java : clone() operation calling super.clone()

我不完全理解在類的clone()方法中返回super.clone()的想法。 首先,與它返回一個包含LESS數據而不是請求的超類的對象有關,因為超類“不是”子類,而是子類“是”超類。 如果有一個長鏈子類,每個子類都調用super.clone(),為什么不會導致它最終在鏈的根處調用Object.clone(),這不是任何子類?

對不起,如果那令人困惑; 我有時會困惑自己

Objectclone()的實現檢查實際的類是否實現Cloneable ,並創建該實際類的實例。

因此,如果您想使您的類可克隆,您必須實現Cloneable並將super.clone()的結果向下轉換到您的類。 另一個負擔是對super.clone()的調用可以拋出你必須捕獲的CloneNotSupportedException ,即使你知道它不會發生(因為你的類實現了Cloneable )。

Object類上的Cloneable接口和clone方法是面向對象設計出錯的一個明顯例子。

考慮一下:你有一系列繼承類。 每個人都可以(或可能不)擁有自己的變量。 與復制引用的equals運算符(==)相反,克隆的作用是帶有新引用的對象的克隆副本。 對於上面的示例,您希望克隆鏈中的最后一個對象。 由於最后一個對象是由其超類構成的,其中每個對象可能具有不同的克隆方法實現,因此在克隆自己的對象之前,調用clone的超類實現首先接收克隆的父對象是很有意義的。

通常與克隆相關的另一個術語是淺層克隆和深度克隆。 淺層克隆是指創建對象的精確副本,而深度克隆則創建對象的副本以及原始對象引用的任何子對象。

有關克隆此鏈接的更多信息

更仔細地讀取Object.clone()javadoc :它返回對象的副本。 該副本是與調用克隆的對象相同的類的另一個實例。 foo.clone().getClass() == foo.getClass()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM