Java的clone()用法实例解析
1.背景
? ? ? ? ?用java寫程序的時候很苦惱的一件事就是,如果將一個對象a賦給另一個對象b,那么你改變a的變量值得時候,b的值也對應的變化。如果我們只想單純的獲取那個時刻的a的狀況給b的話,就要用到clone方法了。
比如說如下代碼:
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubNode n=new Node();Node n1=n;n.a=5;System.out.print(""+n1.a);}} public class Node {int a=1;}輸出結果是5,
下面就利用clone實現如上情況輸出結果是1.
2.代碼
克隆的實現需要一下幾步:
在派生類中覆蓋基類的clone()方法,并聲明為public。
在派生類的clone()方法中,調用super.clone()。
在派生類中實現Cloneable接口。Cloneable接口沒有任何抽象的方法,這樣的成為標識接口。實現這個接口,只是為了告訴編譯器這個對象可以被克隆了。
首先我們在派生類中覆蓋了Object類的Clone()方法,并聲明為public的。然后我們調用了super.clone()方法,這里會拋出一個異常(對于這個異常大家可以自己查看java的幫助文檔),所以必須用try……catch……語句捕獲,然后返回此對象。這里需要說明一下,Clone()方法返回的是Object類型的,所以需要強制類型轉換public class Main {public static void main(String[] args) {// TODO Auto-generated method stubNode n=new Node();Node n1=(Node)n.clone();n.a=5;System.out.print(""+n1.a);}} public class Node implements Cloneable{int a=1;public Object clone(){Node n=null;try{n=(Node)super.clone();}catch(Exception e ){e.printStackTrace();}return n;} }
輸出結果是1;
ps:補充一道題
15. 不通過構造函數也能創建對象嗎()
A 是 ? ? B 否
答案:A
解析:Java創建對象的幾種方式(重要):
(1) 用new語句創建對象,這是最常見的創建對象的方法。
(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
(3) 調用對象的clone()方法。
(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
(1)和(2)都會明確的顯式的調用構造函數 ;(3)是在內存上對已有對象的影印,所以不會調用構造函數 ;(4)是從文件中還原類的對象,也不會調用構造函數。
引用:【1】http://blog.csdn.net/mengxiangyue/article/details/6818611 ? ? ? ? ? ?【2】http://blog.csdn.net/lanxuezaipiao/article/details/16753743
/********************************
* 本文來自博客 ?“李博Garvin“
* 轉載請標明出處:http://blog.csdn.net/buptgshengod
******************************************/
總結
以上是生活随笔為你收集整理的Java的clone()用法实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【码农本色】用数据解读我的2014
- 下一篇: 【算法数据结构Java实现】Java实现