當前位置:首頁 » 編程語言 » clonejava

clonejava

發布時間: 2022-05-23 11:18:03

java的clone方法

1.Object中的clone執行的時候使用了RTTI(run-time type identification)的機制,動態得找到目前正在調用clone方法的那個reference,根據它的大小申請內存空間,然後進行bitwise的復制,將該對象的內存空間完全復制到新的空間中去,從而達到shallow的目的。
所以你調用super.clone() 得到的是當前調用類的副本,而不是父類的副本。
2.這句話是J2SE API幫助裡面的話,意思是要讓實例調用clone方法就需要讓此類實現Cloneable介面,API裡面還有句話是:如果在沒有實現 Cloneable 介面的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常,這便是「合法」的含義。 但請注意,Cloneable介面只是個標簽介面,不含任何需要實現的方法,就像Serializable介面一樣。

3. Object.clone()? 不能這么調用的。

回答還滿意么。

/*------------------以下是對問題的補充---悲哀的注釋------------*/

ok 請容我慢慢道來
你看到clone()是Object的方法,而Object是所有類的父類,就認為可以用Object調用 clone是么?
但不能使用Object調用clone()方法
原因如下:
1.從你寫法本身來看,Object.clone()肯定不行,因為Object是類, 而clone()是成員方法,所以不能用Object.clone();
2.那麼是不是可以先Object obj=new Object();再obj.clone();或者Object.class.newInstance().clone()呢?還是不行。
clone()對Object類對象本身是不可見的。所以你會發現找不到clone()方法
原因是:clone()方法是protected訪問許可權
方法原型:protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException
而protected許可權的含義是:只對同一包中的類和不同包中的子類及間接子類可訪問,換句話說就是不同包中的非子類或間接子類不能訪問,包含了默認的包訪問許可權。
這個地方容易混淆哦
你可能會問任何類都是Object的子類為什麼不能訪問呢,對,任何類是他的子類也繼承了clone()方法
但請注意,你那句代碼clone()的調用者是誰?是Object本身,即Object對象,正如我們所說,「不同包中的非子類或間接子類不能訪問」,這裡面也包括了父類本身,你調用者是父類,在不同包中,protected成員對父類不可見哦,所以根本不能用object對象調用clone()

綜上,因為在不同包中父類本身不能調用,也找不到protected方法 ,故無法在代碼中使用object直接調用clone()方法,

有點難理解,關鍵在對protected的理解上,因為protected除了本身在繼承上的訪問許可權外,還包含了包訪問許可權,希望回答你還滿意。

❷ Java中Object.clone方法的用途是什麼

clone方法是用來復制一個對象。不同於「=」。
對於值類型的數據是可以通過「=」來實現復制的。但是對於引用類型的對象,「=」只能復制其內存地址,使對象的引用指向同一個對象,而不會創建新的對象。clone則可以創建與原來對象相同的對象。舉個例子:
有一個Car類
Car c1 = new Car();
Car c2 = c1;
這兩句事實上只創建了一個對象。只不過c1和c2指向了同一個對象。
如果上面的兩句改為:
Car c1 = new Car();
Car c2 = c1.clone();
那麼就有了兩個對象,而且這兩個對象的內容是一樣的。(所有的屬性值相同)
同時,我想說的是一樓的使用,雖然程序本身沒有錯誤,但是用date.clone()添加到list當中,會再次創建date的對象,消耗內存資源,這是編程的忌諱。特別是編寫java程序,更要好好利用內存的有限資源,避免浪費。

❸ java 編程clone方法

1、Cloneable介面只是個標記介面,裡面沒有任何實現方法,不實現Cloneable介面也可以使用Object的clone方法
2、任何類都是Object的子類,在子類里當然可以直接調用clone方法,比如super.clone()
3、注意clone方法用native修飾,表明該方法有方法體只是調用的jre外部方法,一般是用C語言實現,其作用是通過jvm和操作系統底層交互
4、參照3

❹ java代碼 clone()函數的作用是什麼

從樓主對回答的追問上發現,樓主的連JAVA基本的語法都很差啊。=號是賦值運算符,不是比較。

double[] vectorValue;
vectorValue = vectorValue.clone();

這個段代碼執行肯定報錯了。但他還的意思還是很明確的。

首先:double[] vectorValue; 這個是定義了一個double類型的數組變數vectorValue。

其次:vectorValue = vectorValue.clone(); //這個是將vectorValue 克隆一份,賦值給自己。也就是說vectorValue變數指向了新的一塊內存區域。

舉個例子可能更能說明問題。

{
privateinti;
publicTestMain(inti){
this.i=i;
}

@Override
protectedObjectclone(){
//TODOAuto-generatedmethodstub
returnnewTestMain(this.getI()+1);
}

publicintgetI(){
returni;
}

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub

TestMaintm1=newTestMain(1);
TestMaintm2=tm1;
tm1=(TestMain)tm1.clone();
System.out.println(tm1.getI());//tm1指向的是通過clone()方法創建的新的對象的地址,i的值已經是2了。
System.out.println(tm2.getI());//tm2指向的還是tm1創建時的地址,i的值為1

}

}

❺ java clone方法 怎麼用

什麼是"clone"?

在實際編程過程中,我們常常要遇到這種情況:


有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,並且此後對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。在 Java語言中,用簡單的賦值語句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段。

Java的所有類都默認繼承java.lang.Object類,在java.lang.Object類中有一個方法clone()。JDK API的說明文檔解釋這個方法將返回Object對象的一個拷貝。

要說明的有兩點:

一是拷貝對象返回的是一個新對象,而不是一個引用。

二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。

怎樣應用clone()方法?

一個很典型的調用clone()代碼如下:

{
publicintaInt;
publicObjectclone(){
CloneClasso=null;
try{
o=(CloneClass)super.clone();
}catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returno;
}


有三個值得注意的地方,

一是希望能實現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 中 如果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中clone方法的疑問

因為在java.lang.Object類的定義里,clone()這個方法是protected,
按照protected的訪問控制范圍規定,只能是當前類,或當前包,或其他包的子類,這三種情況能訪問。

注意這里的」能訪問「都是通過原有對象訪問的。

你可能以為你代碼里obj滿足」其他包的子類「這個條件,錯了,一旦new出來,就脫離了作用域了。而super仍是原有對象,因此可以訪問父類Base乃至Object的保護的clone()方法。

❽ java中clone出的對象怎麼用

首先必須實現介面,publicinterfaceCloneable此類實現了Cloneable介面,以指示Object.clone()方法可以合法地對該類實例進行按欄位復制。如果在沒有實現Cloneable介面的實例上調用Object的clone方法,則會導致拋出CloneNotSupportedException異常。按照慣例,實現此介面的類應該使用公共方法重寫Object.clone(它是受保護的)。請參閱Object.clone(),以獲得有關重寫此方法的詳細信息。==》protectedObjectclone()注意,此介面不包含clone方法。因此,因為某個對象實現了此介面就克隆它是不可能的。即使clone方法是反射性調用的,也無法保證它將獲得成功。{publicDated=newDate();@OverridepublicBoxclone(){Boxcloned=(Box)super.clone();cloned.d=(Date)d.clone();return(Box)super.clone();}publicstaticvoidmain(String[]args)throwsException{Boxb=newBox();Boxb2=(Box)b.clone();System.out.println(b.d==b2.d);}}測試後直接返回的話結果是地址相等。你在克隆後用了set方法重新操作了,肯定是不一樣的。。。。!!!3,注釋起來後結果是改變了的,你會不會是沒編譯保存。你們老師是說的對的你好,當然知道你說的那樣。我正是因為三個的試過了,所以最後沒改回去,那不正是你第二個問題嘛。。。如果是深克隆就是FALSE不是深克隆就返回TRUE啊。

❾ java里clone方法的問題

首先必須實現介面,
public interface Cloneable此類實現了 Cloneable 介面,以指示 Object.clone() 方法可以合法地對該類實例進行按欄位復制。

如果在沒有實現 Cloneable 介面的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常。

按照慣例,實現此介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。請參閱 Object.clone(),以獲得有關重寫此方法的詳細信息。
==》protected Object clone() throws CloneNotSupportedException

注意,此介面不 包含 clone 方法。因此,因為某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。

public class Box implements Cloneable{

public Date d = new Date();

@Override
public Box clone() throws CloneNotSupportedException
{
Box cloned = (Box)super.clone();

cloned.d = (Date)d.clone();

return (Box)super.clone();
}
public static void main(String[] args) throws Exception {
Box b = new Box();
Box b2 = (Box)b.clone();

System.out.println(b.d == b2.d);
}
}

測試後直接返回的話結果是地址相等。
你在克隆後用了set方法重新操作了,肯定是不一樣的。。。。!!!
3,注釋起來後結果是改變了的,你會不會是沒編譯保存。
你們老師是說的對的

你好,當然知道 你說的那樣。我正是因為三個的試過了,所以最後沒改回去,那不正是你第二個問題嘛。。。
如果是深克隆就是FALSE 不是深克隆就返回TRUE啊。

❿ 如何克隆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是相同對象的別名。這種情況通常叫做淺拷貝,因為它僅僅復制一個對象的「表面」部分。實際的對象由這個「表面」,引用指向的所有對象,以及那些對象指向的所有對象等構成。這往往被稱作「對象網路」。下一頁>>

熱點內容
腳本師傳奇 發布:2025-02-13 14:45:48 瀏覽:480
我的世界lce伺服器剪輯 發布:2025-02-13 14:40:50 瀏覽:624
phpsftp上傳 發布:2025-02-13 14:35:43 瀏覽:273
c學生管理系統資料庫 發布:2025-02-13 14:21:41 瀏覽:122
傳奇添加會員腳本 發布:2025-02-13 14:20:50 瀏覽:205
微信開發平台源碼 發布:2025-02-13 14:14:20 瀏覽:613
安卓大屏屏幕休眠是什麼意思 發布:2025-02-13 14:13:28 瀏覽:464
腳本的參數設置 發布:2025-02-13 14:11:57 瀏覽:863
androidtexture 發布:2025-02-13 14:11:57 瀏覽:393
怎麼取消網路密碼怎麼設置 發布:2025-02-13 14:11:54 瀏覽:426