導航:首頁 > 編程語言 > java子類克隆

java子類克隆

發布時間:2022-09-28 15:00:38

java中任何類都可以看作是object類的子類,那麼自己定義的類能直接調用object類的clone()方法嗎

並不能,
在Object中clone是一個 protected native 的方法
要調用Object的clone方法,必須實現Clonable介面,在運行時,jvm會做檢測,如果沒有實現Clonable介面,就會拋出CloneNotSupportedException異常。
如果在類的內部調用clone方法,可以直接調用父類的clone方法
要在外部調用它,必須定義一個public的方法,然後調用它的父類的clone方法

Ⅱ 如何Java復制父類對象的數據到子類對象中

可以做到。首先數組的定義就是一組相同數據類型的集合,而繼承父類的子類作為一種引用數據類型,他造出的對象也是可以保存在數組當中的。但是基本上沒人會這樣做,但實現我認為是能夠的,你想想,String作為一種引用數據類型,他造出的字元串都可以保存在數組中,子類為什麼不能呢?
-

Ⅲ 如何克隆Java對象

Java中的對象涉及使用引用類型,沒有直接的方法可將一個對象的內容復制到一個新對象中。將一個引用分配給另一個引用只會給相同對象建立另一個引用。因此,Java對所有引用類型使用一個特殊的clone()方法,為對象復制自身提供一個標準的機制。以下是你需要了解和克隆Java對象有關的細節。為何建立一個本地拷貝?給一個對象建立本地拷貝的原因很可能是由於你計劃修改該對象,並且你不想修改方法調用者的對象。如果你確定你需要一個本地拷貝,你可以使用Object類的clone()方法來執行這項操作。clone()方法被定義為受保護方法,但你必須在你希望克隆的所有子類中重新公開定義它。例如,標准庫類ArrayList忽略clone(),但你可以這樣為ArrayList調用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1』s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一個Object,它必須重新轉變為適當的類型。這個例子說明ArrayList的clone()方法如何不能自動克隆ArrayList包含的每一個對象?原有ArrayList和克隆後的ArrayList是相同對象的別名。這種情況通常叫做淺拷貝,因為它僅僅復制一個對象的「表面」部分。實際的對象由這個「表面」,引用指向的所有對象,以及那些對象指向的所有對象等構成。這往往被稱作「對象網路」。下一頁>>

Ⅳ Java 中 如果clone為什麼必須實現Cloneable介面

因為如果不繼承自Cloneable介面,當調用clone()時會拋出CloneNotSupportedException異常

以下是詳細講解:

Java的所有類都默認繼承java.lang.Object類,在java.lang.Object類中有一個方法clone()。JDK API的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象返回的是一個新對象,而不是一個引用。二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
怎樣應用clone()方法?
一個很典型的調用clone()代碼如下:
class CloneClass implements Cloneable{
public int aInt;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}

有三個值得注意的地方,一是希望能實現clone功能的CloneClass類實現了Cloneable介面,這個介面屬於java.lang 包,java.lang包已經被預設的導入類中,所以不需要寫成java.lang.Cloneable。另一個值得請注意的是重載了clone()方 法。最後在clone()方法中調用了super.clone(),這也意味著無論clone類的繼承結構是什麼樣的,super.clone()直接或 間接調用了java.lang.Object類的clone()方法。下面再詳細的解釋一下這幾點。

應該說第三點是最重要的,仔細 觀察一下Object類的clone()一個native方法,native方法的效率一般來說都是遠高於java中的非native方法。這也解釋了為 什麼要用Object中clone()方法而不是先new一個類,然後把原始對象中的信息賦到新對象中,雖然這也實現了clone功能。對於第二點,也要 觀察Object類中的clone()還是一個protected屬性的方法。這也意味著如果要應用clone()方法,必須繼承Object類,在 Java中所有的類是預設繼承Object類的,也就不用關心這點了。然後重載clone()方法。還有一點要考慮的是為了讓其它類能調用這個clone 類的clone()方法,重載之後要把clone()方法的屬性設置為public。

那麼clone類為什麼還要實現 Cloneable介面呢?稍微注意一下,Cloneable介面是不包含任何方法的!其實這個介面僅僅是一個標志,而且這個標志也僅僅是針對 Object類中clone()方法的,如果clone類沒有實現Cloneable介面,並調用了Object的clone()方法(也就是調用了 super.Clone()方法),那麼Object的clone()方法就會拋出CloneNotSupportedException異常。

Ⅳ 在java中,如何復制一個對象比如說string對象

可以使用clone來實現,clone用於為引用類型的復制
1.使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常
2、實現Cloneable介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
3、在Java.lang.Object類中克隆方法是這么定義的:
protected Object clone()
throws CloneNotSupportedException
創建並返回此對象的一個副本。表明是一個受保護的方法,同一個包中可見。
按照慣例,返回的對象應該通過調用 super.clone 獲得。

詳見關於clone的API文檔

Ⅵ java 的克隆為什麼會拋出 CloneNotSupportedException異常

Object聲明的protected clone雖然可以阻止實現clone()的子類,在子類外部直接調用clone(),但是對靜態方法卻沒有辦法,因為靜態方法可以直接訪問protected的方法,而這樣就有可能會出現對對象使用clone(),而實際對象不支持clone(),所以此時就會拋出這個異常。

Ⅶ Java中對對象克隆,一定要實現Cloneable介面嗎

是的。如果沒有實現Cloneable介面,則調用Object的clone方法克隆對象將會拋出下面這個錯誤:
CloneNotSupportedException
- 如果對象的類不支持 Cloneable 介面,則重寫 clone
方法的子類也會拋出此異常,以指示無法復制某個實例。更多java技術請訪問bug315。

這是Object中clone方法的定義:
protected Object clone() throws CloneNotSupportedException

Ⅷ java中對象的克隆疑問

Object o1=new Object();
System.out.println(o1.hasCode());//列印o1的內存地址。
Object o2=new Object();
System.out.println(o2.hasCode());//列印o2的內存地址。
可見o1和o2擁有不同的內存數據,如果你讓o2=o1,那o1和o2的地址就一樣了,就是一個對象了,怎麼還叫克隆?
老祖宗Object類的clone方法是將一個對象的數據原封不動的復制到另一個對象中去,比如o2=o1.clone();就將o1的數據復制了一份考貝到了另一塊內存中,所以o2與o1地址不一樣但數據相同。
你這里的super.clone();就是調用的Object類的clone()方法,調用Object的方法不就是省得你自己寫了嗎。
你可能還會問Object既然有clone()方法,而所有的類都是Object類的子類,那所有的類不都有clone()方法嗎,干什麼還自己寫?Object類雖然有clone()方法,但是訪問控制符是protected而不是public,於是別的類不可見,所以你需要重寫它:

@Override
public Object clone(){
Object obj=null;
try {
obj= super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
而且你需要將你的類實現cloneable介面,這是必須的。

Ⅸ java里關於克隆的問題,所有類都是Object的子類何必在復寫clone方法

深度克隆的問題,如果類中成員包含集合類,如list等,或者包含map的,默認的clone方法為淺克隆,不會復制集合中的元素。如果復寫clone方法,則可根據需求來復製成員。

Ⅹ java對象之間如何實現克隆(復制)

用clone()方法,不過在對象重載了Object的clone才能用。Object的clone方法是protected。

閱讀全文

與java子類克隆相關的資料

熱點內容
mastercam91安裝教程 瀏覽:119
ie6翻書js 瀏覽:148
干凈的電影網 瀏覽:756
不收費的電視劇網站 瀏覽:947
可投屏的影視大全免費網站 瀏覽:473
韓國電影兄弟倆是雙胞胎 瀏覽:267
cdr挑選工具快捷鍵 瀏覽:284
excel公式不同文件 瀏覽:736
主角穿越只有美女的世界 瀏覽:71
泰國女同電視劇電影 瀏覽:676
我要下載qq訂閱號 瀏覽:649
編程邏輯運算符號什麼意思 瀏覽:735
新編VisualFoxPro應用教程 瀏覽:282
抗日十大完結巔峰小說 瀏覽:890
類似泰國晚娘的電影 瀏覽:150
韓國電影講一個音樂老師 瀏覽:707
大數據詳細職位 瀏覽:92
狗打籃球的電影 瀏覽:153
類似一路向西的電影有哪些 瀏覽:191
app如何實現霸屏 瀏覽:72

友情鏈接