java深复制两种方式

java深复制两种方式

1 实现Cloneable接口

class S implements Cloneable
{
	/*
	 * 引用,get和set
	 * 
	 */
	T t;
	
	//双层克隆
	@Override
	public Object clone() throws CloneNotSupportedException
	{
		//此时还是浅复制 
		S S = (S)super.clone();
		//调用被引用对象的克隆方法
		S.setT((T)=S.getT().clone());
		return S;
	}
}
//被引用的类
class T implements Cloneable
{
	//属性,get和set
	
	//覆写克隆方法
	@Override
	public Object clone() throws CloneNotSupportedException
	{
		//调用父类克隆方法
		return super.clone();
	}
	
}

2 serializable方式实现

public class CloneTest3 {
	public static void main(String[] args) throws Exception
	{
		T T = new T();
		
		S s1 = new S();
		//s1.setT(t);
		
		S s2 = (S)s1.deepCopt();
	}
}
//被S引用的类
class T implements Serializable
{
//	这个serialVersionUID为了让该类别Serializable向后兼容
//	private static final long serialVersionUID = 1L;
//	private static final long serialVersionUID = 8940196742313994740L;
	/*
	 * 属性,get和set
	 */
}
	class S implements Serializable
	{
		//序列化id
		private static final long serialVersionUID = 1L;
		
		/*
		 * 各 引用(类已经实现序列化接口)
		 */
		T t;
		/*
		 * get和set
		 */
		
		//获取被深复制的对象
		public Object deepCopt()throws Exception
		{
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutputStream  oos = new ObjectOutputStream(bos);
			oos.writeObject(this);
			//将当前这个对象写到一个输出流当中,,因为这个对象的类实现了Serializable这个接口,若在这个类中
			//有一个引用,这个引用如果实现了序列化,那么这个也会写到这个输出流当中
			
			ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bis);
			return ois.readObject();
			//这个就是将流中的东西读出类,读到一个对象流当中,这样就可以返回这两个对象的东西,实现深复制
		}
	}

参考自:https://blog.csdn.net/qq_28081081/article/details/80455150

猜你喜欢

转载自blog.csdn.net/baidu_38225647/article/details/83993075