`
explore
  • 浏览: 80964 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java浅克隆和深克隆的定义

    博客分类:
  • J2SE
阅读更多

转自: http://wxg6203.iteye.com/blog/649648

 

深克隆与浅克隆


大家知道,对象是互相引用的,即对象中可能包含了另一个对象的引用,举例如:有一个Order对象,Order对象中又包含了LineItems对象,然后LineItems对象又包含了Item对象。


好了,现在我有一个Order对象order1,它包含了一个LineItems对象items,这表示的是有一个订单order1,订单的内容是items。


好的,现在有另一个客户想要一份订单,内容跟order1完全一样,那么在系统的逻辑层我们怎么做呢?很简单,order2=order1.clone(). 我们知道clone方法是在内存中生成一个新的对象,而不是只得到原对象的引用。这时候,有人说话了:“哦,明白了我们对order2的成员变量进行修改,是不会影响order1的。” 很可惜,这句话只对了一半。


假设order类有一个成员变量name,当然改变order2.name不会影响order1.name,因为他们在不同的内存区域。但是如果改变 order1.items呢?很遗憾,简单地使用order1.clone,是会影响到order2.items的。原因很简单,就是因为clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,items对象在内存中只有一个,order1和order2都指向它,任何一个对象对它的修改都会影响另一个对象。


那相对浅克隆,深克隆自然就是会克隆对象引用的对象了。也就是说,在上例中,改变order1.items并不会影响order2.items了。因为内存中有两个一样的items。


如果实现深克隆?

一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。绝!


这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。

分享到:
评论

相关推荐

    java 深克隆与浅克隆

    Java 中的克隆机制可以让我们方便地制造出一个对象的副本来,但是在克隆过程中需要注意浅克隆和深克隆的区别。 浅克隆(Shallow Clone)是指对对象的域进行简单的 copy,对象的reference变量也会被copy,但是对应的...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    克隆和序列化(Java )

    在Java中,克隆分为浅克隆和深克隆。浅克隆只是复制对象的引用,而深克隆则会创建对象以及所有嵌套对象的新副本。 2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...

    java 对象克隆

    在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,那么新对象和原对象会...

    Java深浅clone

    在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让我们理解`Cloneable`接口。在Java中,如果一个类想要支持`clone()`方法,它必须实现`...

    深入JAVA对象深度克隆的详解

    在Java中,深度克隆与浅克隆的区别在于处理对象内部引用的复杂性。浅克隆只复制对象本身,而不复制它所引用的对象,而深度克隆则会递归地复制对象及其引用的所有子对象。 当对象包含复杂的数据结构,如集合或嵌套的...

    java深度复制源代码

    在Java中,对象的复制分为浅复制和深度复制两种。浅复制是指创建一个新的对象,并将原对象的非引用类型的字段值复制到新对象中;对于引用类型的字段,只是复制了引用地址,即新旧对象共享同一份数据。而深度复制则是...

    Java深复制与浅复制.doc

    1. **浅复制(浅克隆)**: 浅复制是指创建一个新对象,这个新对象包含了原对象的所有字段的值,但对引用类型的字段只是复制了引用,而不是复制引用的对象本身。也就是说,新对象和原对象引用了同一块内存区域。如果...

    对象克隆(clone)详解.docx

    在Java中,克隆主要涉及到`Object`类中的`clone()`方法,以及两种不同的克隆类型:浅克隆和深克隆。 一、克隆的原理与应用 `clone()`方法的工作原理是在堆上创建一个新的对象,这个新对象的内存分配与源对象相同,...

    深入理解Java中的克隆

    要正确地实现克隆,需要理解浅拷贝和深拷贝的区别,并根据需求选择合适的复制策略。同时,需要注意`Cloneable`接口的使用以及`clone()`方法的重写,以避免`CloneNotSupportedException`异常。在处理包含可变引用类型...

    java-6个机制.doc

    克隆分为浅克隆和深克隆。浅克隆仅复制对象的基本数据类型属性,而对于非基本类型,它复制的是引用,意味着新旧对象共享同一个引用对象。深克隆不仅复制基本类型,还会对非基本类型的属性执行递归克隆,确保每个新...

    面试指南java

    - Java实现浅克隆与深克隆:掌握如何在Java中实现对象的浅克隆和深克隆。 - 枚举可以序列化吗:了解枚举类型是否支持序列化。 - Java创建对象的方式:熟悉new关键字、clone方法、反射、反序列化等创建对象的手段。 ...

    Java概论(面试指南)

    Java求职面试指南还提到了Java的高级特性,比如序列化与反序列化,以及Java实现浅克隆与深克隆的机制。这些特性在实际的项目开发中非常关键,面试官往往会对这些知识点进行考察。求职者应该对如何处理Java对象的序列...

    java实验指导书

    实验要求实现House类的深克隆,学生需要理解什么是浅拷贝和深拷贝,以及如何通过实现Cloneable接口和重写clone()方法来实现深克隆。 实验7 计算多个二维图形的面积之和: 这个实验可能涉及到多个形状类(如Circle、...

    java Clone

    `clone`方法分为两种类型:浅克隆(Shadow Clone)和深克隆(Deep Clone)。浅克隆是指只复制对象本身,而不复制其引用的对象。如果对象中包含其他对象的引用,那么这些引用的对象不会被复制,而是共享同一份引用。...

    2015Java面试指南

    - **Java实现浅克隆与深克隆**:浅克隆复制对象本身及含有引用的对象地址,而深克隆则复制了对象本身及所有成员变量的值。 - **枚举可以序列化吗**:枚举类型默认实现了`Serializable`接口,因此可以直接进行序列化...

Global site tag (gtag.js) - Google Analytics