j详细说明ava于clone办法
原文地址:http://leihuang.org/2014/11/14/java-clone/
In java, it essentially means the ability to create an object with similar state as the original object.
什么是clone
字典中的意思就是復(fù)制(強調(diào)跟原來的一模一樣)。
*By default, java cloning is ‘field by field copy’ *.由于Object類不知道詳細(xì)類的結(jié)構(gòu),無法確定哪個clone方法將被調(diào)用。
所以JVM規(guī)定clone,做例如以下操作。
翻譯的不好。%>_<%
除了上面兩條默認(rèn)的操作之外。你也能夠重載clone方法,制定一套自己的clone方法。
java中clone規(guī)則
每種支持clone的語言都有它自己的規(guī)則,java也不例外。java中假設(shè)一個類需要支持clone的話。必需要做例如以下事情:
以下我們通過樣例來分析:
class Father implements Cloneable{private int age ;private String name ;private Son son ;public Father(int age,String name,Son son){this.age = age ;this.name = name ;this.son = son ;}public Son getSon(){return this.son ;}@Overrideprotected Object clone()throws CloneNotSupportedException{return super.clone() ;} } class Son{private int age ;private String name ;public Son(int age ,String name){this.age = age ;this.name = name ;}public void setName(String name){this.name = name ;}public String getName(){return this.name ;} } public class CloneDemo {public static void main(String args[]) throws CloneNotSupportedException{Son s = new Son(10,"Jack") ;Father fa = new Father(40,"Tom",s) ;Father clonedFa = (Father) fa.clone() ;System.out.println(fa!=clonedFa);System.out.println(clonedFa.getClass()==fa.getClass());System.out.println(clonedFa.equals(fa));//now we change the fa's son name by the clonedFa's son nameclonedFa.getSon().setName("Jay");System.out.println(fa.getSon().getName());} } /*print: true true false Jay */
上面的代碼中能夠看出。原始的和克隆的Father類對象。擁有指向同一對象的兩個引用。所以能夠通過改變clonedFa中的Son來改變fa中Son對象。這就時所謂的淺拷貝.以下我們具體討論一下淺拷貝和深拷貝。
淺拷貝(Shallow Cloning)
這是java中默認(rèn)的實現(xiàn)。上面的樣例中就是淺拷貝。不創(chuàng)建一個新的克隆拷貝對象Son,而是直接兩個引用指向同一對象。
深拷貝
If we want a clone which is independent of original and making changes in clone should not affect original.you can try Deep Cloning.
we change the clone() method in the Father class .
@Override protected Object clone() throws CloneNotSupportedException {Father fa = (Father)super.clone(); fa.setSon((Son)fa.getSon().clone());return fa; }
and we need Override the clone() method in the Son class. like this.
@Override protected Object clone() throws CloneNotSupportedException {return super.clone(); }
如今我們已經(jīng)實現(xiàn)深拷貝了。
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)時一種特殊的構(gòu)造器。它講自己的類類型作為參數(shù)。我們傳遞一個類的實例給拷貝構(gòu)造函數(shù)。然后它將返回一個新的類實例。lets see this in example
public class PointOne {private Integer x;private Integer y;public PointOne(PointOne point){this.x = point.x;this.y = point.y;} }
假設(shè)要繼承它的話,則須要復(fù)制子類的參數(shù),和傳遞參數(shù)給父類的構(gòu)造器。
例如以下:
public class PointTwo extends PointOne{private Integer z;public PointTwo(PointTwo point){super(point); //Call Super class constructor herethis.z = point.z;} }
以下是測試代碼:
class Test {public static void main(String[] args){PointOne one = new PointOne(1,2);PointTwo two = new PointTwo(1,2,3);PointOne clone1 = new PointOne(one);PointOne clone2 = new PointOne(two);//Let check for class typesSystem.out.println(clone1.getClass());System.out.println(clone2.getClass());} } Output: class corejava.cloning.PointOne class corejava.cloning.PointOne
你也能夠使用靜態(tài)工廠的方法來實現(xiàn)它。
public class PointOne {private Integer x;private Integer y;public PointOne(Integer x, Integer y){this.x = x;this.y = y;}public PointOne copyPoint(PointOne point) throws CloneNotSupportedException{if(!(point instanceof Cloneable)){throw new CloneNotSupportedException("Invalid cloning");}//Can do multiple other things herereturn new PointOne(point.x, point.y);} }
Cloning with serialization
這是例外一種深拷貝的方法。這里就不多講了,具體見:A mini guide for implementing serializable interface in java
best practices
1) When you don’t know whether you can call the clone() method of a particular class as you are not sure if it is implemented in that class, you can check with checking if the class is instance of “Cloneable” interface as below.
if(obj1 instanceof Cloneable){obj2 = obj1.clone(); } //Dont do this. Cloneabe dont have any methods obj2 = (Cloneable)obj1.clone();
2) No constructor is called on the object being cloned. As a result, it is your responsibility, to make sure all the members have been properly set. Also, if you are keeping track of number of objects in system by counting the invocation of constructors, you got a new additional place to increment the counter.
Reference:
2014-11-14 15:48:12
Brave,Happy,Thanksgiving !
版權(quán)聲明:本文博主原創(chuàng)文章。博客,未經(jīng)同意不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的j详细说明ava于clone办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSharpGL(5)解析3DS文件并用
- 下一篇: mysql_result()函数的简单使