`
bo_hai
  • 浏览: 564231 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA深度和浅度克隆的区别

 
阅读更多

在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。请看下方:

 

深度克隆类:

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

public class DepthClone {
	
	public  final static Object objectCopy(Object oldObj) {
		Object newObj = null;
		
		try {
			ByteArrayOutputStream bo = new ByteArrayOutputStream();
			ObjectOutputStream oo = new ObjectOutputStream(bo);
			oo.writeObject(oldObj);//源对象
			ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
			ObjectInputStream oi= new ObjectInputStream(bi);
			newObj = oi.readObject();//目标对象
		} catch (IOException e) {
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		return newObj;
	}
}

 

浅度克隆类:

import java.io.Serializable;

public class SimpleClone implements Cloneable ,Serializable {

	private static final long serialVersionUID = -7552721152118950502L;
	
	public    String s = null;
    public Object o = null;
    public CloneObject cloneObject = null;
	
	
	public SimpleClone(CloneObject cloneObject) {
		this.cloneObject = cloneObject;
	}

	public Object clone() {
		SimpleClone newSimpleClone =  null;
		try {
			/* 浅克隆 */
			newSimpleClone = (SimpleClone)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return newSimpleClone;
	}
}

 

 克隆对象:

import java.io.Serializable;

public class CloneObject implements Serializable{
	
	private static final long serialVersionUID = 4332788486669750696L;

	private String name ;

	public String getName() {
		return name;
	}

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

 

克隆测试:

public class TestClone {
	
	public static void main(String[] arg) {
		CloneObject obj1 = new CloneObject();
		obj1.setName("cloneOne");
		CloneObject obj2 = new CloneObject();
		obj2.setName("cloneTwo");
		
		SimpleClone simpleClone1 = new SimpleClone(obj1);
		SimpleClone simpleClone2 = new SimpleClone(obj2);
		
		simpleClone1.s = "simpleClone1";
		simpleClone1.o = "simpleClone1Object";
		
		//simpleClone2 = (SimpleClone)simpleClone1.clone();
		
		simpleClone2 = (SimpleClone)DepthClone.objectCopy(simpleClone1);
		
		/* 如果是浅克隆, simpleClone1中的cloneObject会随着simpleClone2的cloneObject改变面改变*/
		simpleClone2.cloneObject.setName("cloneThree");
		
		System.out.println(simpleClone1.cloneObject.getName());
		System.out.println(simpleClone2.cloneObject.getName());
	}
	
}

 

0
4
分享到:
评论
3 楼 bo_hai 2011-07-26  
非常感谢各位的批评。深度克隆和浅度克隆的区别我只是在程序层面理解,理解的很浅。
2 楼 csdxqzp 2011-07-25  
什么深度和浅度,描述都没描述清楚。

专业词汇应该叫 非顶级对象与顶级对象
1 楼 xiaoliefengfeng 2011-07-25  
深度克隆和浅度克隆 有啥区别了,你没说啊,我不懂

相关推荐

    解析JAVA深度克隆与浅度克隆的区别详解

    Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...

    c#深度复制浅度复制

    在C#编程中,"深度复制"和"浅度复制"是对象复制过程中两个重要的概念,它们涉及到如何正确地复制复杂的数据结构。了解并熟练掌握这两种复制方式对于编写高效、可靠的代码至关重要。 首先,让我们来定义这两个术语:...

    基于java实现浅度爬虫应用

    通过不断地迭代和优化,一个简单的Java浅度爬虫就可以逐渐完善,适用于各种实际场景,如新闻聚合、市场分析或搜索引擎的预处理。对于初学者来说,这个项目是一个很好的起点,可以深入理解网络爬虫的工作原理以及Java...

    C#中深度复制和浅度复制详解

    在C#编程中,了解深度复制和浅度复制的概念至关重要,因为它们直接影响到对象的复制行为,特别是当处理包含复杂数据结构的对象时。本文将详细解释这两种复制方式,并通过一个实例来展示它们的区别。 首先,让我们...

    ASP.NET深度复制和浅度复制分析

    根据复制对象内容的不同,可以分为浅度复制和深度复制。 浅度复制,也被称为浅拷贝,它只复制对象引用,而不复制对象本身。在***中,可以通过Object类中的MemberwiseClone()方法实现。MemberwiseClone()创建一个新...

    Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍

    在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...

    prototypeAndCreate.zip

    在“prototypeAndCreate.zip”压缩包中,我们可能找到与原型模式相关的代码示例,包括浅度克隆和深度克隆两种不同的复制策略。浅度克隆仅仅复制对象本身,而不复制其引用的对象,而深度克隆则会递归地复制对象及其...

    javascript克隆对象深度介绍

    JavaScript中的对象克隆是一个重要的概念...总的来说,JavaScript中的对象克隆是处理复杂数据结构的关键技术,理解浅度克隆和深度克隆的区别以及如何实现它们,可以帮助我们编写更健壮的代码,避免意外地修改原始数据。

    java-6个机制.doc

    **1.4 深度克隆与浅度克隆** - **浅度克隆**:仅复制对象的基本类型属性值,对于对象引用类型属性,只复制引用本身而非引用指向的对象。 - **深度克隆**:不仅复制对象本身,还递归复制对象内的所有引用对象。 **...

    初中数学深度学习:从理解到实践.pdf

    深度学习与浅度学习相对,后者通常表现出机械记忆、僵化理解和生硬应用。 2. 初中数学深度学习的重要性:在初中数学教学中,深度学习有助于学生利用已有经验,通过理论梳理和经验提纯,使学习更加深入和有效。 3. ...

    深度学习视域下智能化评价系统的构建路径.pdf

    为了更好地理解深度学习的内涵,我们需明确深度学习与浅度学习的区别。深度学习者具备深度理解知识的能力,能够将新旧知识有机结合起来,并在新环境中灵活运用。而浅度学习者则主要依靠记忆应对考试,无法将知识转化...

    实例详解vue.js浅度监听和深度监听及watch用法

    Vue提供了一个非常实用的功能,即对数据变化的侦听机制,其中包括浅度监听和深度监听。此外,Vue还提供了一个特殊的选项——watch,用来侦听和响应Vue实例上的数据变动。 首先,我们来看浅度监听,它通常指的是Vue...

    高中数学教学中深度学习如何发生浅析.pdf

    1. 提高解决问题的能力:深度学习过程中的反复实践和深度思考,有助于学生形成独特的见解,提高解决问题的能力。 2. 促进综合素质发展:深度学习作为一种新型的学习方式,注重培养学生的自主学习意识和数学知识的...

    MyEclipse浅度优化方法

    ### MyEclipse浅度优化方法 #### 一、引言 在软件开发过程中,开发工具的性能直接影响到工作效率。MyEclipse作为一款流行的Java集成开发环境(IDE),因其丰富的功能和良好的用户界面受到广泛欢迎。然而,对于一些...

    基于深度学习神经网络的车牌字符识别技术的研究.pdf

    早期的车牌字符识别主要依赖于传统的浅度学习方法,比如BP(反向传播)神经网络,但这些方法在处理复杂和非线性问题时存在局限性,包括局部极值、假饱和、收敛速度缓慢等问题。 深度学习的出现为车牌字符识别带来了...

    促进初中物理深度学习的策略探索.pdf

    深度学习与传统的浅度学习不同,浅度学习更注重对知识的记忆和简单应用,而深度学习则包含了记忆、理解、应用、分析、评价和创造六个维度。深度学习的特点在于学习要求的主动性、知识体系的系统性和学习的持续性。 ...

Global site tag (gtag.js) - Google Analytics