Java浅克隆与深克隆
来源:互联网 发布:淘宝卖家店铺被冻结 编辑:程序博客网 时间:2024/06/05 08:12
浅克隆与深克隆
浅克隆的对象与原对象引用不相等,但对象中的对象是相等的
深克隆则是全部不相等
- 浅克隆的实现
需要该类实现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()); }}
- 深克隆的实现
有两种方法,第一种需要类实现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);}
但据网友测试,第一种方法较此方法效率略高
阅读全文
0 0
- java 深克隆与浅克隆
- java 深克隆与浅克隆 .
- java 浅克隆与深克隆
- java 浅克隆与深克隆
- java的深克隆与浅克隆
- Java深克隆与浅克隆
- java浅克隆与深克隆
- java浅克隆与深克隆
- java 中浅克隆与深克隆
- java深克隆与浅克隆
- Java的浅克隆与深克隆
- Java 浅克隆与深克隆
- Java的深克隆与浅克隆
- java深克隆与浅克隆
- java深克隆与浅克隆
- JAVA深克隆与浅克隆1
- java浅克隆与深克隆
- java浅克隆与深克隆
- c++基础之拷贝构造函数
- java的jar打包成exe文件
- 深入理解JVM之类文件结构
- Maximum Product(简单枚举)
- CSS3 二维变形
- Java浅克隆与深克隆
- 数组(九)--十进制转换为十六进制
- 解决mysql Navicat 出错:1130-host . is not allowed to connect to this MySql server
- linux关于bashrc与profile的区别
- Maven详解之仓库------本地仓库、远程仓库
- 实验4:栈和队列的基本操作实现及其应用2
- HTTP状态码知道哪些
- 对于超图划分中的粗化部分的理解
- 图书馆管理系统