java 对象的深拷贝

1 篇文章 0 订阅

浅拷贝:只复制变量的值(引用变量,基本类型的变量),所以复制出来的那个对象N_A里面的引用变量a与原对象O_A的引用变量a里面的地址是一个值,新复制出来的那个对象的a与原来那个对象的a操作一个堆存储。

实现Cloneable接口进行深复制 

package f;

public class deep_copy {
   public static void main(String []arg) throws CloneNotSupportedException {
	   
	   person p=new person();
	   person p1=(person)p.clone();
	  System.out.println(System.identityHashCode(p.I));
	  p1.I.a=100;
	  System.out.println(System.identityHashCode(p1.I)); //计算对象的地址

	   
   }
}

class Info implements Cloneable{
	
	int a=1;
	int b=1;
	String c="4";
	
	@Override
	
	public String toString() {
		return "Info [a=" + a + ", b=" + b + ", c=" + c + "]";
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}

class person implements Cloneable {
     Info I=new Info();
	
	protected Object clone() throws CloneNotSupportedException {
		person p =(person) super.clone();
		p.I=(Info) p.I.clone();
		return p;
	}
	
}

用序列化:将对象 以字节形式保存进内存,然后在取出来;

package f;

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 deep_copy_xl {
  public static void main(String arg[]) throws ClassNotFoundException, IOException
{
	  
    teacher t=new teacher();
    t.name="ajt";
    people p=new people("aa","1604",t);
    people p1=(people) p.getClone();
    System.out.println(p);
    System.out.println(p1);

}
}

class people implements Serializable {
	String name=" ";
	String class_1="";
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getClass_1() {
		return class_1;
	}
	public void setClass_1(String class_1) {
		this.class_1 = class_1;
	}
	public teacher getT() {
		return t;
	}
	public void setT(teacher t) {
		this.t = t;
	}
	teacher t;
	public people(String name,String class_1,teacher t) {
		this.name=name;
		this.class_1=class_1;
		this.t=t;
	}
	
	public Object getClone() 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());
		
	}
}

class teacher implements Serializable{
	String name="";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值