Java浅克隆与深克隆

来源:互联网 发布:淘宝卖家店铺被冻结 编辑:程序博客网 时间:2024/06/05 08:12

浅克隆与深克隆
浅克隆的对象与原对象引用不相等,但对象中的对象是相等的
深克隆则是全部不相等

  1. 浅克隆的实现
    需要该类实现Cloneable接口(该接口无需实现任何方法,只是一个标志),并重写Object类中的clone方法(该方法为protect,只能在其子类中调用),
    编写车轮(Wheel)类,代码如下所示:
public class Wheel {    private String size;    public String getSize() {        return size;    }    public void setSize(String size) {        this.size = size;    }}

汽车(Car)类,内含wheel对象,并实现Cloneable接口,重写clone方法,代码如下所示:

public class Car implements Cloneable{    private String color;    private String band;    private Wheel wheel;    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public String getBand() {        return band;    }    public void setBand(String band) {        this.band = band;    }    public Wheel getWheel() {        return wheel;    }    public void setWheel(Wheel wheel) {        this.wheel = wheel;    }    public Object clone(){        Object object = null;        try {            object = super.clone();        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return object;    }}

测试代码如下:

import java.io.IOException;public class CloneTest {    public static void main(String[] args) throws ClassNotFoundException, IOException {        Car car1 = new Car();        car1.setBand("benz");        car1.setColor("red");        Wheel wheel = new Wheel();        wheel.setSize("14");        car1.setWheel(wheel);        Car car2 = (Car) car1.clone();        // 输出false        System.out.println(car1 == car2);        // 输出true        System.out.println(car1.getWheel() == car2.getWheel());        // car2 band为benz        System.out.println(car2.getBand());        // car2的wheel size为14        System.out.println(car2.getWheel().getSize());    }}
  1. 深克隆的实现
    有两种方法,第一种需要类实现Serializable序列化接口,对象中的对象也需实现序列化。
    Wheel类改造如下:
import java.io.Serializable;public class Wheel implements Serializable {    /**     *      */    private static final long serialVersionUID = -467379705588570699L;    private String size;    public String getSize() {        return size;    }    public void setSize(String size) {        this.size = size;    }}

Car类改造如下:

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class Car implements Cloneable, Serializable{    /**     *      */    private static final long serialVersionUID = 227203306278742729L;    private String color;    private String band;    private Wheel wheel;    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public String getBand() {        return band;    }    public void setBand(String band) {        this.band = band;    }    public Wheel getWheel() {        return wheel;    }    public void setWheel(Wheel wheel) {        this.wheel = wheel;    }    public Object clone(){        Object object = null;        try {            object = super.clone();        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return object;    }    // 深度克隆方法,相当于把对象序列化后再读取出来,保留了对象的全部属性并与原对象不相等    public Object deepClone() throws IOException, ClassNotFoundException{        ByteArrayOutputStream baos = new ByteArrayOutputStream();          ObjectOutputStream oos = new ObjectOutputStream(baos);          oos.writeObject(this);          ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());          ObjectInputStream ois = new ObjectInputStream(bais);          return ois.readObject();      }}

测试类如下:

import java.io.IOException;public class CloneTest {    public static void main(String[] args) throws ClassNotFoundException, IOException {        Car car1 = new Car();        car1.setBand("benz");        car1.setColor("red");        Wheel wheel = new Wheel();        wheel.setSize("14");        car1.setWheel(wheel);        Car car2 = (Car) car1.deepClone();        // 输出false        System.out.println(car1 == car2);        // 输出false,说明深克隆成功        System.out.println(car1.getWheel() == car2.getWheel());    }}

深克隆第二种方法,使用json,将对象转为json,再将json转为对象,实现了深克隆,且不需实现任何接口

public Object deepClone2(){    JSONObject json = (JSONObject) JSON.toJSON(this);    return JSON.toJavaObject(json, Person.class);}

但据网友测试,第一种方法较此方法效率略高

原创粉丝点击