国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

深入淺出Java clone技術

2019-11-18 13:46:19
字體:
來源:轉載
供稿:網友

  這是clone技術介紹的第一篇。本篇主要介紹對象clone技術的基本知識。

Clone基本知識儲備
java里提到clone技術,就不能不提java.lang.Cloneable接口和含有clone方法的Object類。所有具有clone功能的類都有一個特性,那就是它直接或間接地實現了Cloneable接口。否則,我們在嘗試調用clone()方法時,將會觸發CloneNotSupportedException異常。下面我們通過對Object類的部分源碼的分析,來發現和理解這一特性。請看JDK中Object# clone()方法的源碼:

/*

…………

* @return a clone of this instance.
* @exception? CloneNotSupportedException? if the object's class does not
*support the Cloneable interface. Subclasses
*that override the clone method can also
* throw this exception to indicate that an instance cannot
*be cloned.
* @see java.lang.Cloneable
*/


PRotected native Object clone() throws CloneNotSupportedException;



這段源碼的@exception部分的描述內容證實了上文關于clone對象特性論斷的正確性。它明確指出對象類必須支持Cloneable接口,否則即使派生類覆蓋了Object#clone()方法,也同樣會拋出CloneNotSupportedException這個異常。關于覆蓋clone()方法,后續文章將會用專門篇幅進行比較具體的分析.


在上一篇中,介紹了java里clone的基本知識。本篇將著重描述如何實現clone。





l clone的實現

1.實現Cloneable接口

通過上一篇的介紹,我們知道,一個類若要具備clone功能,就必須實現Cloneable接口。做到這一步,clone功能已經基本實現了。Clone功能對我們來說,最主要的還是要能夠使用它。那么我們如何才能使用clone功能呢?答案是覆蓋Object#clone()方法。

2. 覆蓋Object#clone()方法

為什么需要覆蓋Object#clone()方法?這里得再次從jdk源碼說起。JDK中Object# clone()方法的原型是:

protected native Object clone() throws CloneNotSupportedException;

是否注重到,這里clone()方法修飾符是protected,而不是public。這種訪問的不可見性使得我們對Object#clone()方法不可見。相信讀者已明白為什么要覆蓋Object#clone()方法。而且,覆蓋的方法的修飾符必須是public,假如還保留為protected,覆蓋將變得沒有實際意義。下面舉一個具有clone功能的簡單的例子:

/*

* 具有clone功能的類的例子

*/

public class CloneableObjExample implements Cloneable {

//……部分代碼已省略……

private String name = null;

private int score = 0;





/**

* NOTE: 將protected 修飾符 更改為 public

* @see java.lang.Object#clone()

*/

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父類的clone方法

Object result = super.clone();



//TODO: 定制clone數據

return result;

}

}

3.定制clone

至此,clone已經真相大白。Clone的對象我們可以對其進行定制。還就上面的例子來說。下面的方法對功能做了一定的增強:

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父類的clone方法

CloneableObjExample result = (CloneableObjExample)super.clone();



//TODO: 定制clone數據

//雖然”clone”了,但還可以做點調整

result.name = “New Name”;



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沅陵县| 宝兴县| 威信县| 吴旗县| 江达县| 甘洛县| 秦安县| 凤山县| 大悟县| 濮阳市| 新宾| 吴川市| 平陆县| 湘潭市| 巩义市| 博客| 西乌珠穆沁旗| 新密市| 平湖市| 安庆市| 盘锦市| 习水县| 连州市| 金平| 舞阳县| 宝兴县| 安宁市| 宜春市| 岳普湖县| 清徐县| 临沂市| 汉源县| 平果县| 阜新市| 朔州市| 儋州市| 和顺县| 蒙城县| 临澧县| 年辖:市辖区| 确山县|