Java关于克隆与“冷藏”和“解冻”方法

来源:岁月联盟 编辑:zhuzhu 时间:2007-08-28

 

import java.awt.Point;import java.io.IOException;import com.sun.corba.se.impl.io.OptionalDataException;/** * 克隆测试<br> * 以方形类为例,比较了深克隆(deep clone)与浅克隆(shallow clone)的异同 *  * @see #clone() * @author 88250 * @version 1.0.0, 2007-8-26 */public class CloneTester{    private Square square = new Square();    private Square cpySquare = null;    /**     * 浅克隆操作     */    public void shallowClone()    {    square.setSideLength(2);    square.setLocation(new Point(2, 5));    // 浅克隆    cpySquare = (Square) square.clone();    }    /**     * 深克隆操作     */    public void deepClone()    {    square.setSideLength(3);    square.setLocation(new Point(1, 3));    // 深克隆    try    {        cpySquare = (Square) square.deepClone();    }    catch (OptionalDataException e)    {        e.printStackTrace();    }    catch (IOException e)    {        e.printStackTrace();    }    catch (ClassNotFoundException e)    {        e.printStackTrace();    }    }    /**     * 克隆结果输出     */    public void cloneDisplay()    {    System.out.println("原始方形长度:" + square.getSideLength());    System.out.println("克隆方形长度:" + cpySquare.getSideLength());    System.out.println("原始方形==克隆方形?" + (square == cpySquare));    System.out.println("原始方形的位置==克隆方形的位置?"        + (square.getLocation() == cpySquare.getLocation()));    }    public static void main(String[] args)    {    CloneTester sm = new CloneTester();    sm.shallowClone();    sm.cloneDisplay();    sm.deepClone();    sm.cloneDisplay();    }}

 

 

import java.awt.Point;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import com.sun.corba.se.impl.io.OptionalDataException;/** * 正方形 *  * @author 88250 * @version 1.0.0, 2007-8-26 */public class Square implements Cloneable, Serializable{    private Point location = new Point(0, 0);    private float sideLength = 1F;    @Override    public Object clone()    {    Square tmp = null;    try    {        tmp = (Square) super.clone();    }    catch (CloneNotSupportedException cnse)    {        cnse.printStackTrace();    }    finally    {        return tmp;    }    }        /**     * 深克隆方法     * @return     */    public Object deepClone()    throws IOException, OptionalDataException, ClassNotFoundException    {    // 首先将对象写到流里    ByteArrayOutputStream bo = new ByteArrayOutputStream();    ObjectOutputStream oo = new ObjectOutputStream(bo);    oo.writeObject(this);        // 然后将对象从流里读出来    ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());    ObjectInputStream oi = new ObjectInputStream(bi);        return (oi.readObject());    }    /**     * @return the location     */    public Point getLocation()    {        return location;    }    /**     * @param location the location to set     */    public void setLocation(Point location)    {        this.location = location;    }    /**     * @return the sideLength     */    public float getSideLength()    {        return sideLength;    }    /**     * @param sideLength the sideLength to set     */    public void setSideLength(float sideLength)    {        this.sideLength = sideLength;    }}