`
这些年
  • 浏览: 399822 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对象的拷贝

 
阅读更多

在java中对象的拷贝分为两种:

                 一种是:浅拷贝(实现Cloneable)

                 一种是:深拷贝(使用数据流的序列化与反序列化)

浅拷贝的缺点:

1、 基本类型
如果变量是基本很类型,则拷贝其值,比如int、float等。
2、 对象
如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。
3、 String字符串
若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有对象保持不变。

 1:浅拷贝代码:

class Person implements Cloneable {
	/** 姓名 **/
	private String name;

	/** 电子邮件 **/
	private Email email;

	public String getName() {
		return name;
	}

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

	public Email getEmail() {
		return email;
	}

	public void setEmail(Email email) {
		this.email = email;
	}

	public Person(String name, Email email) {
		this.name = name;
		this.email = email;
	}

	public Person(String name) {
		this.name = name;
	}

	protected Person clone() {
		Person person = null;
		try {
			person = (Person) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}

		return person;
	}
}

class Email {

	private String message = "";
	public String content = "";

	public Email() {
	}

	public Email(String message, String content) {
		this.content = content;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}

public class TestClone {
	public static void main(String[] args) {
		// 写封邮件
		Email email = new Email("请参加会议", "请与今天12:30到二会议室参加会议...");

		Person person1 = new Person("张三", email);

		Person person2 = person1.clone();
		person2.setName("李四");
		Person person3 = person1.clone();
		person3.setName("王五");
		person1.getEmail().setContent("请与今天12:00到二会议室参加会议...");
//		person1.setEmail(new Email("", "请与今天12:00到二会议室参加会议..."));//须要新建对象才可能修改不同的
		System.out.println(person1.getName() + "的邮件内容是:"
				+ person1.getEmail().getContent());
		System.out.println(person2.getName() + "的邮件内容是:"
				+ person2.getEmail().getContent());
		System.out.println(person3.getName() + "的邮件内容是:"
				+ person3.getEmail().getContent());
	}
}

 修改clone方法其现对象分离(其实就是新建了一个对象)

	protected Person clone() {  
        Person person = null;  
        try {  
            person = (Person) super.clone();  
            person.setEmail(new Email("",person.getEmail().getContent()));  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
          
        return person;  
    } 

 2:深拷贝(被拷贝对象须要实现 Serializable接口

 拷贝对象的工具类

 

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class CloneUtils {  
    @SuppressWarnings("unchecked")  
    public static <T extends Serializable> T clone(T obj){  
        T cloneObj = null;  
        try {  
            //写入字节流  
            ByteArrayOutputStream out = new ByteArrayOutputStream();  
            ObjectOutputStream obs = new ObjectOutputStream(out);  
            obs.writeObject(obj);  
            obs.close();  
              
            //分配内存,写入原始对象,生成新对象  
            ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());  
            ObjectInputStream ois = new ObjectInputStream(ios);  
            //返回生成的新对象  
            cloneObj = (T) ois.readObject();  
            ois.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return cloneObj;  
    }  
}  
 其它类

 

 

import java.io.Serializable;

class Person implements Serializable {

	private static final long serialVersionUID = 3623459427337616520L;

	/** 姓名 **/
	private String name;

	/** 电子邮件 **/
	private Email email;

	public String getName() {
		return name;
	}

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

	public Email getEmail() {
		return email;
	}

	public void setEmail(Email email) {
		this.email = email;
	}

	public Person(String name, Email email) {
		this.name = name;
		this.email = email;
	}

	public Person(String name) {
		this.name = name;
	}
}

class Email  implements Serializable{
	private static final long serialVersionUID = 2913307304989215405L;
	private String message = "";
	public String content = "";

	public Email() {
	}

	public Email(String message, String content) {
		this.content = content;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}

public class TestClone {
	public static void main(String[] args) {
		  //写封邮件  
        Email email = new Email("请参加会议","请与今天12:30到二会议室参加会议...");  
          
        Person person1 =  new Person("张三",email);  
          
        Person person2 =  CloneUtils.clone(person1);  
        person2.setName("李四");  
        Person person3 =  CloneUtils.clone(person1);  
        person3.setName("王五");  
        person1.getEmail().setContent("请与今天12:00到二会议室参加会议...");  
          
        System.out.println(person1.getName() + "的邮件内容是:" + person1.getEmail().getContent());  
        System.out.println(person2.getName() + "的邮件内容是:" + person2.getEmail().getContent());  
        System.out.println(person3.getName() + "的邮件内容是:" + person3.getEmail().getContent());
	}
}
 参考:http://blog.csdn.net/chenssy/article/details/12952063

 

分享到:
评论

相关推荐

    JavaScript对象拷贝与Object.assign用法实例分析

    JavaScript中的对象拷贝是编程中常见的操作,尤其在处理复杂数据结构时显得尤为重要。对象拷贝分为两种主要类型:浅拷贝和深拷贝。 浅拷贝是指创建一个新对象,新对象的属性引用了原对象中属性的引用。这意味着,当...

    javaEE的对象拷贝工具dozer

    Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...

    对象拷贝-优雅的解决方案Mapstruct.docx

    ### 对象拷贝:MapStruct 作为一种优雅的解决方案 #### MapStruct 介绍 MapStruct 是一种类型安全的 bean 映射类生成 Java 注释处理器,它简化了对象间属性的映射过程。开发者只需定义一个映射接口并声明所需的...

    sigslot C++开源库-解决信号对象拷贝问题.zip

    Sigslot 是一个小型但功能强大的 C++ 开源库,专门用于实现信号(signals)和槽...通过修复信号对象拷贝的问题,它变得更加可靠,适用于更广泛的场景。在实际开发中,结合 sigslot 可以设计出更灵活、响应式的系统。

    Domain对象拷贝工具类

    用于两个domain对象的拷贝,支持字段自动覆盖,选择性覆盖,选择性字段拷贝,作用:当你有多个domain对象都需要生成另外的同一个domain对象的时候这个方法就很有用了,或许存在BUG,欢迎指出

    房间内对象拷贝插件文件

    要求把目标房间内需要拷贝的对象做成一个组(Group),如果有些对象不希望拷贝,可以不放入组内。 所以你需要先把一个房间内的东西都布置创建好,并且用Revit命令需要为每一个房间创建Room对象。有了这些条件就...

    java工具类大合集,集成了通用响应实体、对象拷贝、集合转换、加密工具、格式化工具、随机中文、JSR校验、常用自定义异常等

    工具包目前集成了通用响应实体、对象拷贝、集合转换、加密工具、格式化工具、随机中文、JSR校验、常用自定义异常、swagger-ui和驼峰转换等工具。每个工具的详细实用见README.md文档,有非常详细的记录。

    Revit房间内对象拷贝插件加载文件

    要求把目标房间内需要拷贝的对象做成一个组(Group),如果有些对象不希望拷贝,可以不放入组内。 所以你需要先把一个房间内的东西都布置创建好,并且用Revit命令需要为每一个房间创建Room对象。有了这些条件就...

    IOS ObjectiveC中的赋值与对象拷贝

    本篇文章将深入探讨Objective-C中的赋值与对象拷贝,特别是深拷贝和浅拷贝的概念。 首先,我们要了解赋值操作(Assignment)。Objective-C中有两种类型的对象:基本数据类型(如结构体)和基于NSObject的对象。对于...

    多维数组和对象-深去重和深拷贝.js

    对多维数组,对象,进行去重,相同的值只保留一个,常见的new Set()和filter,只能去重一维数组,并不能进行深层的去重,逻辑:判断是否为对象,为对象判断是否为数组或是真的对象,递归一直筛选为值,判断首次...

    .net下的对象拷贝

    Omu.ValueInjecter.dll 更多信息请移步http://valueinjecter.codeplex.com/

    Java copy对象的工具类

    Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...

    JavaScript对象拷贝与赋值操作实例分析

    在JavaScript编程中,对象拷贝与赋值是经常会用到的操作,但这两者是有显著区别的。对象赋值通常意味着让一个变量引用另一个已经存在的对象,也就是在内存中两个变量指向同一个对象的地址。而对象拷贝则是创建一个新...

    java对象拷贝常见面试题及应答汇总

    Java对象拷贝常见面试题及应答汇总 在Java编程中,对象拷贝是一种常见的操作, 涉及到对象的复制和克隆。下面总结了一些常见的面试题和应答,供大家学习和参考。 为什么要使用克隆? 在某些情况下,我们需要对一...

    python对象比较、拷贝、参数传递.zip

    二、Python对象拷贝 在Python中,对象的拷贝分为浅拷贝(shallow copy)和深拷贝(deep copy)。 1. 浅拷贝:通过`copy()`函数或`[:]`切片操作创建新对象,只拷贝对象的表面层次。如果原对象包含可变对象(如列表...

    java对象的深拷贝和浅拷贝[归类].pdf

    在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...

    【JavaScript源代码】详解jQuery的拷贝对象.docx

    ### jQuery中的对象拷贝 #### 一、引言 在前端开发中,对象拷贝是一项常用的操作,尤其是在处理数据更新、避免数据污染等场景时。jQuery 提供了一套简便的方法来实现对象拷贝,即 `$.extend()` 方法。本文将详细...

Global site tag (gtag.js) - Google Analytics