`
837062099
  • 浏览: 111507 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java clone

阅读更多
当需要clone的类里只有基本类型和String类时,用影子拷贝。需要拷贝的类必须继承Cloneable接口,并实现Object 类的clone()方法。该接口标识该类可以clone,和序列化接口类似。
package demo.clone;


/**
 * 浅拷贝(影子拷贝)
 * @author XN
 *
 */
public class ShallowCopy implements Cloneable {
	private int id;
	private String name;
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	@Override
	public String toString() {
		return "hashcode:"+this.hashCode() + "-->"+"id:" + id + "-->" +"name:" + name;
	}
	/**
	 * @param args
	 */
	
	public static void main(String[] args) throws CloneNotSupportedException {
		ShallowCopy shallowCopy=new ShallowCopy();
		shallowCopy.id = 11;
		shallowCopy.name = "copytest";
		System.out.println(shallowCopy);
		ShallowCopy shallowCopy1=(ShallowCopy)shallowCopy.clone();
		System.out.println(shallowCopy1);
		
	}
}



当需要拷贝的类中有类的成员变量时,就需要深拷贝。下面提供两种方法:实现Cloneable接口和实现序列化接口。
package demo.clone

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

/**
 * 深拷贝
 * @author XN
 *
 */
public class DeepCopy implements Cloneable, Serializable {

	private static final long serialVersionUID = 1L;
	public DC dc = new DC();


	/** 通过实现Cloneable接口来实现深拷贝(当该类包含其他类的可变对象变量时用深度拷贝)*/
	@Override
	public Object clone() throws CloneNotSupportedException {
		Object o = super.clone();
		DeepCopy d = (DeepCopy) o;
		d.dc = (DC) dc.clone();
		return d;
	}

	/**
	 * 通过实现序列化来实现深拷贝,该类必须实现序列化接口
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public Object deepClone() throws IOException, 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());
	}
//	public Object readResolve() {
//		return this;
//	};

	/**
	 * @param args
	 * @throws CloneNotSupportedException
	 * @throws ClassNotFoundException
	 * @throws IOException
	 */
	public static void main(String[] args) throws CloneNotSupportedException,
			IOException, ClassNotFoundException {
		
		DeepCopy deepCopy1 = new DeepCopy();
		System.out.println(deepCopy1);
		System.out.println(deepCopy1.dc);

		DeepCopy deepCopy2 = (DeepCopy) deepCopy1.clone();
		System.out.println(deepCopy2);
		System.out.println(deepCopy2.dc);

		DeepCopy deepCopy3 = (DeepCopy) deepCopy1.deepClone();
		System.out.println(deepCopy3);
		System.out.println(deepCopy3.dc);
	}

}

class DC implements Cloneable, Serializable {
	
	private static final long serialVersionUID = 1816856252611186327L;

	@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics