java的“別名”以及clone機制

來源:互聯網
上載者:User
什麼是別名?用個簡單的例子說明public class Aliases{ int i; public Aliases() { i=1; } public Aliases(int i) { this.i=i; } public static void main(String args[]) { Aliases A=new Aliases(); Aliases B=A; //A和B指向了同一個對象,A和B互為別名 System.out.println("A.i and B.i:"+A.i+" "+B.i); System.out.println("增加B:"); B.i++; System.out.println(("A.i and B.i:"+A.i+" "+B.i); }}輸出:A.i and B.i:1 1 增加B: A.i and B.i:2 2很明顯,A和B指向了同一個對象,B=A這個操作只是把A的引用複製給了B,而對象並未拷貝。java是通過Rerference來操作對象的,上面是一個顯式別名的例子,當你往函數內傳遞對象時也會發生別名,如下: public class Aliases{ int i; public Aliases() { i=1; } public Aliases(int i) { this.i=i; } public Increment(Aliases AS) { AS.i++; } public static void main(String args[]) { Aliases A=new Aliases(); System.out.println("A.i before Increment:"+A.i); Increment(A); System.out.println("A.i after Increment:"+A.i); }}你可以看到A在經過函數Increment()的調用後i的值發生了變化。在某種情況下,你可能不希望傳入的對象發生變化,希望函數內的對象只是傳入對象的副本,對這個副本的改變不至於影響原來的對象,那該如何處理?我們知道C++是通過把參數聲明了const,就意味著此參數不可改變,但是別忘了,C++有所謂的拷貝建構函式,所以在函數中的對象確實是拷貝,而java並未支援拷貝建構函式,原因很明顯,java傳遞對象的引用,你就算拷貝也只是引用的拷貝而已(所以有人說java本質上只有傳值)。那麼就沒辦法了嗎?有的,那就是“複製機制”,在根類Object已經定義了clone()方法,你所要做的只是實現cloneable介面,並覆寫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;}}調用super.clone()方法,它會為你自動處理儲存分配和複製操作,從而實現了對象的深層拷貝。我們又知道,同過serilization也可以實現對象的深層拷貝啊,為什麼不用這個?根本原因在於效率上的巨大差異,clone()雖然一開始好象很複雜,但畢竟沒有對象的讀寫那麼耗費資源。有了clone機制,你就可以在方法調用內部製造一個對象的副本了,它是局域性,對它的任何操作都不至於影響原對象的狀態了。我個人認為,這點對於編寫一個安全的大型程式是非常重要的。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。