1. 程式人生 > >http://www.blogjava.net/woxingwosu/archive/2008/01

http://www.blogjava.net/woxingwosu/archive/2008/01

Java克隆Clone
☆什麼是Clone Clone就是得到一個物件x的副本,而且x.clone() != x。Clone分為兩種:淺度克隆Shallow Clone和淺度克隆Deep Clone


Object類有clone()方法: protected native Object clone() throws CloneNotSupportedException; 但是Object本身沒有implements Cloneable,在執行clone方法時,先檢查this.getClass()是否實現了cloneable介面,如果沒有實現Cloneable介面,clone()就會拋CloneNotSupportedException返回。否則就會建立一個新的this.getClass()的物件other,並將this每一個field的值賦值給other的對應field,然後返回other。

介面Cloneable起一個標誌作用(和Serializable類似),用來標誌該類具有克隆功能。


☆實現Shallow clone Shallow Clone只是將基本型別賦值過去,對於物件傳的是引用。(String對於比較特別,[一般內容一樣則引用一樣,輕量級模式])Shallow Clone
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian");
System.out.println("area:"+area);
Area areaClone=area.clone();
System.out.println("areaClone:"+areaClone);
System.out.println("area==areaClone:"+(area==areaClone));
System.out.println("area.getClass()==areaClone.getClass():"+(area.getClass()==areaClone.getClass()));
area.province="jiangxi";
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Area(String province){
this.province=province;
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province;
}
}輸出結果
area: province=fujian
areaClone: province=fujian
area==areaClone:false
area.getClass()==areaClone.getClass():true
area: province=jiangxi
areaClone: province=fujian

☆Shallow Clone的問題 因為對於物件只是拷貝引用,所有就會造成this對其中物件的修改引起other中相應物件的修改,例子如下:Shallow Clone問題
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian","fujian info");
Area areaClone=area.clone();
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
area.province="jiangxi";
area.info.name="new info";
System.out.println("--------After Change-------");
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Info info;
Area(String province,String infoName){
this.province=province;
info=new Info(infoName);
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province+"\t info="+info.name;
}
}

class Info{
String name;
Info(String name){
this.name=name;
}
}輸出結果
area: province=fujian info=fujian info
areaClone: province=fujian info=fujian info
--------After Change-------
area: province=jiangxi info=new info
areaClone: province=fujian info=new info


☆Deep Clone 有些時候我們不希望this與other之間的修改相互影響,這時就應該用深度克隆。對所有涉及到的物件也實現Clone。Deep Clone
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian","fujian info");
Area areaClone=area.clone();
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
area.province="jiangxi";
area.info.name="new info";
System.out.println("--------After Change-------");
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Info info;
Area(String province,String infoName){
this.province=province;
info=new Info(infoName);
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
area.info=this.info.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province+"\t info="+info.name;
}
}

class Info implements Cloneable{
String name;
Info(String name){
this.name=name;
}
@Override
public Info clone(){
Info info=null;
try{
info=(Info)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return info;
}
}輸出結果
area: province=fujian info=fujian info
areaClone: province=fujian info=fujian info
--------After Change-------
area: province=jiangxi info=new info
areaClone: province=fujian info=fujian info

☆參考:
http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html
http://www.blogjava.net/junky/archive/2007/05/08/115928.html

相關推薦

http://www.blogjava.net/woxingwosu/archive/2008/01

Java克隆Clone ☆什麼是Clone Clone就是得到一個物件x的副本,而且x.clone() != x。Clone分為兩種:淺度克隆Shallow Clone和淺度克隆Deep Clone Object類有clone()方法: prote

反編譯java class並優雅的除錯--http://www.blogjava.net/miaoyachun/archive/2013/02/22/395575.html

https://sourceforge.net/projects/realignmentjd/files/ 官方文件 用jd-eclipse 外掛來反編譯java class檔案的輸出還是挺nice的,雖然閱讀方便了 但是對debug確造成一定的困擾,主要問題是line

http://www.cnblogs.com/henw/archive/2012/01/06/2314870.html

log pro 初始化 響應 ces 控制 ber cal r12 C#多線程學習 之 線程池[ThreadPool] 在多線程的程序中,經常會出現兩種情況: 一種情況: 應用程序中,線程把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應

新blog:http://www.blogjava.net/jnbzwm/

一、在研究join的用法之前,先明確兩件事情。 1.join方法定義在Thread類中,則調用者必須是一個線程, 例如: Thread t = new CustomThread();//這裡一般是自定義的執行緒類 t.start();//執行緒起動 t.join();//此

STL中迭代器淺析(轉自:http://blog.csdn.net/gou_zh/archive/2008/11/04/3209974.aspx)

STL中迭代器淺析 C++中的迭代器主要有三種,迭代器的作用就是讓你用*iter就可以訪問容器中的值,用iter++就可以向後遍歷,而不必去管容器的內部結構。 1.insert iterator(安插型迭代器,三種)back_insert_iterator, front_in

拆解組裝SQL字串全過程---sql練習--轉自Jinjazz(http://blog.csdn.net/jinjazz/archive/2009/09/01/4507720.aspx)

use tempdb go if (object_id ('t_Item' ) is not null ) drop table t_item go if (object_id ('t_Buy' ) is not null ) drop table t_Buy go create

nodeJS中的包 npm install http://www.cnblogs.com/xiaohuochai/archive/2017/05/20/6882027.html

.html 方法 href 對象 inux gif 例子 配置文件 安裝 前面的話   Node組織了自身的核心模塊,也使得第三方文件模塊可以有序地編寫和使用。但是在第三方模塊中,模塊與模塊之間仍然是散列在各地的,相互之間不能直接引用。而在模塊之外,包和NPM則是將模塊

<轉載> MySQL 性能優化的最佳20多條經驗分享 http://www.jb51.net/article/24392.htm

構造 進程 還需 query 情況 關聯表 string類型 優化技巧 fix 當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要註意數據操作的性能。這裏,我們不會講過多的SQL語句的優化,而只是針對MySQL這一Web應用最多的數據庫。希望下

Java String和Date的轉換 轉http://www.cnblogs.com/bmbm/archive/2011/12/06/2342264.html

ref integer public cat 標記 星期 import 轉換 star Java String和Date的轉換 String—>Date方法一: String dateString = "2012-12-06 "; try {

數字證書原理 - 轉自 http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html

在操作 computer ide iis 中斷 計算 虛擬 from 上進 文中首先解釋了加密解密的一些基礎知識和概念,然後通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現所起的作用。接著對數字證書做一個詳細的解釋,並討論一下windows中數字證書的管理

數據挖掘 - 算法 - ID3 - 轉自 http://www.cnblogs.com/dztgc/archive/2013/04/22/3036529.html

str htm bar c++代碼 度量 進行 初始化 ++ 預測 1 簡介   決策樹學習是一種逼近離散值目標函數的方法,在這種學習到的函數被表示為一棵決策樹。 2 決策樹表示   決策樹通過把實例從根節點排列到某個葉子結點來分類實例,葉子結點即為實例所屬的分類。樹上的

Java時間日期格式轉換 轉自:http://www.cnblogs.com/edwardlauxh/archive/2010/03/21/1918615.html

throws 星期四 stat 格式轉換 see blog 一是 取得數據 www Java時間格式轉換大全 import java.text.*; import java.util.Calendar; public class VeDate { /** * 獲取

Oracle常用的一些 資料字典 轉https://www.cnblogs.com/neozhu/archive/2008/07/22/1248422.html racle常用資料字典表

Oracle常用資料字典表   Oracle常用資料字典表      檢視當前使用者的預設表空間   

電商的一些問題https://www.cnblogs.com/dingxue/archive/2008/11/16/1334367.html

問題: 1.購物車中的資料是否應該儲存在資料庫中? 我特別想知道在真正的專案中,那些真正的軟體工程師是如何考慮這個問題的。在Google上一搜,搜到了一篇咱園子裡一位網友的觀點:購物車應該是個臨時儲存資料的模組,他將其存放在Session物件中。這位網友說的很有道理,不過我並

資料庫ID---轉載自http://www.cnblogs.com/kissdodog/archive/2013/05/28/3102862.html

邏輯資料庫設計 - 需要ID(談主鍵Id)   本文的目標就是要確認那些使用了主鍵,卻混淆了主鍵的本質而造成的一種反模式。 一、確立主鍵規範   每個瞭解資料庫設計的人都知道,主鍵對於一張表來說是一個很重要,甚至必需的部分。這確實是事實,主鍵是好的

程式碼生成資料庫及更新資料庫:Entity Framework first code(http://www.cnblogs.com/haogj/archive/2012/02/17/2356537.ht

準備工作 在開始之前,我們需要一個專案,以及一個 Code First 的模型,對於這次演示,我們使用典型的部落格 Blog 和回覆 Post 模型。 1. 建立新的  MigrationsCodeDemo 控制檯應用程式 2. 為專案新增最新版本的 Entity

js深拷貝和淺拷貝----尊重原創,轉自:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html

一、陣列的深淺拷貝 在使用JavaScript對陣列進行操作的時候,我們經常需要將陣列進行備份,事實證明如果只是簡單的將它賦予其他變數,那麼我們只要更改其中的任何一個,然後其他的也會跟著改變,這就導致了問題的發生。 var arr = ["One","Two","Th

http://www.52lf.net

從三個方面來說:首先要宣告的一點它們都是語言結構,不是函式一、速度echo/print在一般使用中表現是一樣的,但它們會有細微不同,echo不返回數,print會返回值(這是區別之一),所以echo速度要快二、表現方式正是因為print有返回值,所以它可以用它表示複雜的表示式

Linux 硬限制和軟限制 http://www.cppblog.com/API/archive/2012/03/19/168289.html

這一部分的提出是為了防止失控的程序破壞系統的效能 nuix和Linux跟蹤程序使用的大部分資源,允許使用者和系統管理員使用對程序的資源限制  設定的限制有兩種: 硬限制和軟限制 硬限制是可以在任何時候任何程序中設定  但硬限制只能由超級使用者提起 軟限制是核心實際執行的限制,任何程序都可以將軟限制設定為任意

面向站長和網站管理員的Web快取加速指南[翻譯] 原文(英文)地址: http://www.mnot.net/cache_docs/ 版權宣告:署名-非商業性使用-禁止演繹 2.0 這是一篇知識性

什麼是Web快取,為什麼要使用它? Web快取位於Web伺服器之間(1個或多個,內容源伺服器)和客戶端之間(1個或多個):快取會根據進來的請求儲存輸出內容的副本,例如html頁面, 圖片,檔案(統稱為副本),然後,當下一個請求來到的時候:如果是相同的URL,快取直接使用副本響應訪問請求,而不是向源伺服器再次