JAVA 对象深度复制实现

原创 2016年05月31日 11:01:10

JAVA 有两种深度复制实现方式,分别是实现Cloneabel接口,并在接口函数中为每个属性调用Cloneable,也可以通过序列化的方式来实现。

package JAVAImprove;

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 DeepClone implements Cloneable, Serializable{
	
	private transient LearnClone Lc;
	
	public LearnClone getLc() {
		return Lc;
	}



	public void setLc(LearnClone lc) {
		Lc = lc;
	}



	//注意序列化是不会调用构造函数的。
	public DeepClone(){
		
		System.out.println("Constractor");
		Lc = new LearnClone();
	}
	
	
	
	public static void main(String[] args){
		
		DeepClone dc = new DeepClone();
		
		try {
			DeepClone dc2 = (DeepClone)dc.clone();
			
			System.out.println("dc start:" + dc.getLc().getCheck());
			System.out.println("dc2 start:" + dc2.getLc().getCheck());
			
			
			
			
			//深度复制
			ByteArrayOutputStream bo = new ByteArrayOutputStream();
			try {
				ObjectOutputStream ot = new ObjectOutputStream(bo);
				
				ot.writeObject(dc);
				
				ot.close();
				
				ByteArrayInputStream io = new ByteArrayInputStream(bo.toByteArray());
				ObjectInputStream ip = new ObjectInputStream(io);
				
				//try {
					DeepClone dc3 = (DeepClone)ip.readObject();
					
					dc3.getLc().setCheck("is Deep Clone");
				
					System.out.println("dc3 end" + dc3.getLc().getCheck());
					
					System.out.println("dc end" + dc.getLc().getCheck());
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}
package JAVAImprove;

import java.io.Serializable;

public class LearnClone implements Cloneable, Serializable {
	
	
	private String check = "learn Clone";

	public String getCheck() {
		return check;
	}

	public void setCheck(String check) {
		this.check = check;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
	public static void main(String[] args){
		//
		
		LearnClone cl = new LearnClone();
		cl.setCheck("ttt");
		
		LearnClone c2;
		try {
			c2 = (LearnClone)cl.clone();
			if(c2 == cl){
				System.out.println("equal");//首先实现接口可以完成属性的拷贝。
			}
			System.out.println("start cl" + cl.getCheck());
			System.out.println("start c2" + c2.getCheck());
			//不是一个值
			c2.setCheck("aaaaaaaaaaaaaa");
			System.out.println("c2" + c2.getCheck());
			System.out.println("C1" + cl.getCheck());
			
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
	

}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java深度拷贝一个对象

深度拷贝一个Java对象,无论这个对象里面有什么样的参数,比如String、数组、Object类型,或者Object类型里面又有Object类型的参数。 而且这个被拷贝的对象无须实现Serializa...
  • ghuiL
  • ghuiL
  • 2015年10月26日 13:36
  • 1495

JAVA对象的深度克隆

有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值!     也许你会说,用clone()不就...

Java集合对象的深度复制与普通复制

最近在开发中遇到了一些关于集合复制的一些问题,普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域。所以当拷贝的集合修改了集合...

Java 实现深度复制

Java深度复制

Java对象的深复制和浅复制

原文链接我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的引用传递也就是地址传递,而很多时候对于对象传递我们也希望能够象值传...

JAVA 对象拷贝

1.java里的clone分为:  A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。  b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。  Jav...

java List 深度复制方法

之前探讨过Java数组的深复制问题,现在来说说。为什么不说呢?因为在寻找探索的过程中,我发现了这些不靠谱的方法,写下来是希望给自己和他人提个醒,不要犯这样的错误。   这是下面要频繁使用的...

JAVA深层拷贝 - DeepCopy

方法实现很简单,提供两中方式: 一种是序列化成数据流,前提是所有对象(对象中包含的对象...)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以...
  • isea533
  • isea533
  • 2013年07月19日 08:50
  • 8949

Java深度拷贝

基本概念 浅拷贝:复制后对象的所有基本类型域的值与原对象相等,所有引用指向的对象和原对象指向的对象相同 深拷贝:复制后对象的所有基本类型的值与原对象相等,且他们的引用指向不同的对象,但对象中的基本...

Java中的深拷贝和浅拷贝介绍

一、引言    对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部 数据。Java...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA 对象深度复制实现
举报原因:
原因补充:

(最多只允许输入30个字)