首页 > 编程语言 > 详细

java浅克隆与深克隆

时间:2016-07-13 02:25:31      阅读:212      评论:0      收藏:0      [点我收藏+]

java浅克隆与深克隆

?

  • 浅克隆 通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。
  • 深克隆 克隆的时候会克隆它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。

?

?????? 浅克隆

?

/**
 * 浅克隆
 * @author InJavaWeTrust
 *
 */
class Father implements Cloneable {

	public String name;
	public int age;

	public Father(String name, int age) {
		this.name = name;
		this.age = age;
	}

}

public class Child implements Cloneable {

	public String name;
	public int age;
	public Father father;

	public Child(String name, int age, Father father) {
		this.name = name;
		this.age = age;
		this.father = father;
	}
	
	public Object clone() {
		Child child = null;
		try {
			child = (Child) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return child;
	}
	
	public static void main(String[] args) {
		Father father = new Father("李刚", 44);
		Child child1 = new Child("李启铭", 14, father);
		Child child2 = (Child) child1.clone();
		child2.father.name = "赵刚";
		child2.father.age = 40;
		child2.name = "赵启铭";
		child2.age = 15;
		System.out.println(child1.name + " " + child1.age);
		System.out.println(child1.father.name + " " + child1.father.age);
		System.out.println(child2.name + " " + child2.age);
		System.out.println(child2.father.name + " " + child2.father.age);
	}
//	运行结果
//	李启铭 14
//	赵刚 40
//	赵启铭 15
//	赵刚 40
//	浅克隆时father对象都是共用的,所以father重新赋值之后,之前的值也跟着变化。
	
}

?

?????? 深克隆

/**
 * 深克隆
 * @author InJavaWeTrust
 *
 */
class Father implements Cloneable {
	
	public String name;
	public int age;
	
	public Father(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Object clone() {
		Father father = null;
		try {
			father = (Father) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return father;
	}

}

public class Child implements Cloneable {
	
	private String name;
	private int age;
	private Father father;
	
	public Child(String name, int age, Father father) {
		this.name = name;
		this.age = age;
		this.father = father;
	}
	
	public Object clone() {
		Child child = null;
		try {
			child = (Child) super.clone();
			child.father = (Father) father.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return child;
	}

	public static void main(String[] args) {
		Father father = new Father("李刚", 44);
		Child child1 = new Child("李启铭", 14, father);
		Child child2 = (Child) child1.clone();
		child2.father.name = "赵刚";
		child2.father.age = 40;
		child2.name = "赵启铭";
		child2.age = 15;
		System.out.println(child1.name + " " + child1.age);
		System.out.println(child1.father.name + " " + child1.father.age);
		System.out.println(child2.name + " " + child2.age);
		System.out.println(child2.father.name + " " + child2.father.age);
	}
//	运行结果
//	李启铭 14
//	李刚 44
//	赵启铭 15
//	赵刚 40
//	深克隆时father对象也 重新拷贝了一份,所以father重新赋值之后,之前的值不会发生变化。

}

?

????? 利用序列化也可以实现深克隆。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 序列化深克隆
 * @author InJavaWeTrust
 *
 */
class Father implements Serializable {

	private static final long serialVersionUID = 5339188002945518918L;
	
	public String name;
	public int age;
	
	public Father(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

public class Child implements Serializable{

	private static final long serialVersionUID = 991407861345394819L;
	
	private String name;
	private int age;
	private Father father;
	
	public Child(String name, int age, Father father) {
		this.name = name;
		this.age = age;
		this.father = father;
	}
	
	public Object deepClone() {
		Object object = null;
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			object = ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}
	
	public static void main(String[] args) {
		Father father = new Father("李刚", 44);
		Child child1 = new Child("李启铭", 14, father);
		Child child2 = (Child) child1.deepClone();
		child2.father.name = "赵刚";
		child2.father.age = 40;
		child2.name = "赵启铭";
		child2.age = 15;
		System.out.println(child1.name + " " + child1.age);
		System.out.println(child1.father.name + " " + child1.father.age);
		System.out.println(child2.name + " " + child2.age);
		System.out.println(child2.father.name + " " + child2.father.age);
	}
//	运行结果
//	李启铭 14
//	李刚 44
//	赵启铭 15
//	赵刚 40

}

?

java浅克隆与深克隆

原文:http://injavawetrust.iteye.com/blog/2310086

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!