本文目錄一覽:
- 1、Java中clone方法的疑問
- 2、java的clone方法
- 3、java中 clone()方法的使用
- 4、Java 中 如果clone為什麼必須實現Cloneable接口
- 5、java 編程clone方法
Java中clone方法的疑問
因為在java.lang.Object類的定義里,clone()這個方法是protected,
按照protected的訪問控制範圍規定,只能是當前類,或當前包,或其他包的子類,這三種情況能訪問。
注意這裡的」能訪問「都是通過原有對象訪問的。
你可能以為你代碼里obj滿足」其他包的子類「這個條件,錯了,一旦new出來,就脫離了作用域了。而super仍是原有對象,因此可以訪問父類Base乃至Object的保護的clone()方法。
java的clone方法
1.Object中的clone執行的時候使用了RTTI(run-time type identification)的機制,動態得找到目前正在調用clone方法的那個reference,根據它的大小申請內存空間,然後進行bitwise的複製,將該對象的內存空間完全複製到新的空間中去,從而達到shallowcopy的目的。
所以你調用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中 clone()方法的使用
final只是不能修改內部值,但是可以修改引用.你a=b.clone();已經把a的引用給修改了!
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方法
1、Cloneable接口只是個標記接口,裏面沒有任何實現方法,不實現Cloneable接口也可以使用Object的clone方法
2、任何類都是Object的子類,在子類里當然可以直接調用clone方法,比如super.clone()
3、注意clone方法用native修飾,表明該方法有方法體只是調用的jre外部方法,一般是用C語言實現,其作用是通過jvm和操作系統底層交互
4、參照3
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301529.html