首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java | 浅克隆与深克隆

前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的。...但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象,Java中的克隆分为浅克隆与深克隆。...实现克隆的方式 1.对象的类需要实现Cloneable接口 2.重写Object类中的clone()方法 3.根据重写的clone()方法得到想要的克隆结果,例如浅克隆与深克隆。...深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。 ? ?...,修改被克隆对象的基本属性,并不会影响克隆出来的对象。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java克隆

    那么如何正确复制对象呢,这里就得说一下Java的Clone。 克隆 Java克隆允许复制一个一模一样内容的对象出来,当改变A内容时,被克隆的B的内容不会一起改变。 为什么要克隆呢?...克隆可以解决这种场景。 这里面有两种克隆,浅克隆和深克隆。...浅克隆- shallow clone 不管是浅克隆还是深克隆,都要先实现 Clonable接口,然后复写 clone()方法并改为 public。...如果我们想把克隆对象里的非基本类型也一并克隆的话,那么需要把引用的类型也同样实现克隆接口。...最后一种克隆方法 如果我们想克隆的对象有多个层次的类型引用,这时候把每一个类型都实现 Clonable接口是不现实的。 那么可以用序列化和发序列化的方法来实现克隆

    55220

    Java的浅克隆与深克隆

    克隆”一词总会让我们想起与生物学相关的科技医学技术,说的就是将动物的细胞取到后进行人工培育,从而培育出一个一模一样的动物(当然也包括人)。...在编程界中同样存在克隆的技术,只不过它与传统的医学不相同的是:它具有浅克隆和深克隆的区别。...也应该知道这条原则对与Hashtable相似的Vector, List, Map, Set等都是一样的。...引用在Java语言的体现就是变量,而变量在Java语言中是有范围的,可以是局部的,也可以是全局的。 生存期:程序只能控制引用的生存周期。对象的生存期是由Java控制。...包,java.lang包已经被缺省的导入类中,所以不需要写成java.lang.Cloneable。

    1.3K40

    Java中的深克隆和浅克隆

    , 供Java程序调用, 要想访问比较底层的与操作系统相关的就没办法了, 只能由靠近操作系统的语言来实现), 就是快啊, 实在更底层实现的....Java中实现浅克隆 java中实现clone要实现 Cloneable 接口, 该接口十分简单, 源码如下: ? 仅仅起到一个标识的作用. 下面是一个实现浅克隆的例子: ?...Java中实现深克隆 将类中的所有引用类型都进行clone, 并重写对象clone()方法, 对所有引用类型进行clone. 代码如下: ? 将所有引用类型都进行clone, 实现了深克隆....Java序列化克隆 如果引用类型中海包括引用类型, 要实现多层克隆会很麻烦, 这使用可以使用序列化和反序列化的方式实现对象的深克隆....由于Java序列化的过程中, 写在流中的是对象的一个拷贝, 而原对象仍然在JVM中, 所以可以利用这个原理来实现对对象的深克隆. 上面代码使用序列化实现如下: ?

    1.7K10

    java开发系列】—— 深克隆和浅克隆

    Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中。那么什么是深克隆,什么是浅克隆呢。   【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。   ...【深克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。   下面的两个例子可以很好的说明他们的区别:   首先看一下类图 ?   ...Husband类有一个对wife的引用,当进行浅克隆的时,wife变量都会指向同一个Wife;而进行深克隆时,会指向不同的Wife。...; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream...; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 import java.util.Date;

    1K70

    Java的对象克隆

    Object 类提供的 clone() 方法是 “浅拷贝”,并没有克隆对象中引用的其他对象,原对象和克隆的对象仍然会共享一些信息。...深拷贝指的是:在对象中存在其他对象的引用的情况下,会同时克隆对象中引用的其他对象,原对象和克隆的对象互不影响。介绍克隆要了解克隆的具体含义,先来回忆为一个包含对象引用的变量建立副本时会发生什么。...注释:Cloneable 接口是 Java 提供的一组标记接口(tagging interface)之一。应该记得:Comparable 等接口的通常用途是确保一个类实现一个或一组特定的方法。...这样就允许子类在不支持克隆时选择抛出一个 CloneNotSupportedException()。子类的克隆必须当心子类的克隆。...参考资料《Java核心技术卷一:基础知识》(第10版)第 6 章:接口、lambda 表达式与内部类 6.2.3 对象克隆

    63610

    JAVA中的浅克隆和深克隆分析

    无论是在java面试过程中,还是在与各种老鸟交流的过程中,对java对象的深浅拷贝,都是一个绕不开的问题,这个问题看似很容易,却是大多数人用来区分小白的标准问题。现在对该问题进行说明。...1.定义 浅克隆(拷贝):复制一个对象的实例,但是这个对象中包含的其它的对象还是共用的。一般用super.clone()方法,clone的对象就是浅克隆。...深克隆(拷贝):复制一个对象的实例,而且这个对象中包含的其它的对象也要复制一份。...Wife类 package com.dhb.CloneTest; import lombok.Data; import java.io.Serializable; import java.util.Date...当然,实现深克隆的方法并不局限于流这一种办法,还可以通过json等其他办法实现。

    86620

    Java--对象的克隆

    因为Java方法中对象参数的传递是句柄(引用)传递,所以方法中对句柄的改动会影响到原对象。 很少调用一个方法来处理它的参数,在实际编程中也要避免改变参数的情况。...使类具有克隆能力: 因为Object类将clone()定义为”protected", 所以衍生类不做点什么的话,是无法具有克隆能力的(很简单,对象无法调用本类的protected方法)。...注意:因为Java不可能在衍生之后反而缩小方法的访问范围,所以一旦对象变得可以克隆,从它衍生的任何东西都是可以克隆的。...它的存在有两个原因: 可能有一个上溯造型句柄指向一个基础类型,而且不知道它是否真的能克隆那个对象。在这种情况下,可用instanceof 关键字调查句柄是否确实同一个能克隆的对象连接。...若已被覆盖,那么再一次覆盖它,并“掷”出一个 CloneNotSupportedException(克隆不支持)违例。为担保克隆被禁止,将类设为final是唯一的办法。

    74170

    Java数组篇:数组克隆

    前言在Java中,数组是一种对象,克隆数组意味着创建数组的一个浅拷贝。这在需要保留原始数组的同时,需要一个内容相同的新数组时非常有用。摘要本文将详细讨论Java中数组克隆的概念、实现方法以及使用场景。...概述数组克隆是利用Java的clone()方法创建数组的一个副本。这个副本与原始数组内容相同,但是它们是两个不同的对象。...这段Java代码演示了如何在多线程环境中使用数组克隆来实现线程安全。...这段Java代码演示了数组克隆的过程以及如何对克隆后的数组进行修改而不会影响原始数组。...小结数组克隆是创建数组副本的简便方法。使用clone()方法可以快速得到一个与原始数组内容相同的新数组。总结本文介绍了Java中数组克隆的概念和实现方法。

    12421

    Java对象的深克隆与浅克隆(对象复制)

    克隆 如果原型对象的成员变量是值类型,将复制一份给克隆对象 如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象, 即原型对象和克隆对象的成员变量指向相同的内存地址。...在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...深克隆克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。 除了对象本身被复制外,对象所包含的所有成员变量也将复制。...在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型...6 总结 实现对象克隆的两种方式: 实现Cloneable接口并重写Object#clone() 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可实现真正的深克隆 基于序列化和反序列化实现的克隆不仅仅是深度克隆

    3.1K52

    探究Java中的克隆

    克隆,想必大家都有耳闻,世界上第一只克隆羊多莉就是利用细胞核移植技术将哺乳动物的成年体细胞培育出新个体,甚为神奇。其实在Java中也存在克隆的概念,即实现对象的复制。...本文将尝试介绍一些关于Java中的克隆和一些深入的问题,希望可以帮助大家更好地了解克隆。...Clone 在Java中,clone是将已有对象在内存中复制出另一个与之相同的对象的过程。java中的克隆为逐域复制。...,效率更低 为什么使用克隆 很重要并且常见的常见就是:某个API需要提供一个List集合,但是又不希望调用者的修改影响到自身的变化,因此需要克隆一份对象,以此达到数据隔离的目的。...除此之外,本书还详细介绍了很多关于Java细节的知识,是Java程序员很值得阅读的一本书。本书也是经典的Jolt获奖作品,作者是Joshua Bloch大神。是一本深入研究Java的参考书籍。

    51620

    一文了解Java对象的克隆,深浅拷贝(克隆

    一、什么是对象的克隆? 在Java的Object类中,有一个方法名为clone(),直译过来就是克隆,核心概念就是复制对象并返回一个新的对象。...(1)在要实现克隆的对象类中实现Cloneable接口。 为啥?...重写是为了扩大访问权限,如果不重写,因Object的clone方法的修饰符是protected,除了与Object同包(java.lang)和直接子类能访问,其他类无权访问。...三、测试(浅克隆) 按照前面官方文档提到的,clone通常是一个浅拷贝,如果要做到深拷贝,需要对复制对象中的对象引用进行修改,换句话说就是浅拷贝的效果就是引用例行的属性无法完全复制,被克隆对象和克隆对象中的该引用类型的属性指向同一个引用...浅拷贝的情况下,原被克隆对象发生变化后,克隆对象的基本数据类型和不可变引用数据类型(String)的数据未发生影响,而cp字段为可变的应用类型,可以观察到克隆对象的内容随着被克隆对象的变化发生了同样的变化

    3.2K40

    Java学习【接口的使用实例,浅克隆与深克隆

    man2));//输出-2 } } 谁调用compareTo方法,this就代表谁 String类型比较 上面比较的age是整型,可以相减,那如果是String 类型呢 可以看出,Java...public int compareTo(Man m) { return this.name.compareTo(m.name); } 多个对象的比较 import java.util.Arrays...,创建person2,把克隆出的数据赋值给person2 浅拷贝 在原来的基础上再加上一个Money类,此时再对克隆后的值进行修改 可以看出,当把person1的money修改之后,两个是都会发生改变的...,这种就叫做浅拷贝 此时就是只克隆了Person的对象,没有克隆Money的对象 深拷贝 如果想要Money也进行克隆,就需要实现Cloneable接口,同时重写clone方法 class Money...,Money也进行克隆,就是深拷贝

    9310

    Java提升篇:对象克隆(复制)

    Java中所有的类都是缺省的继承自Java语言包中的Object类的,查看它的源码,你可以把你的JDK目录下的src.zip复制到其他地方然后解压,里面就是所有的源码。...语言实现的代码,供Java程序调用的,因为Java程序是运行在JVM虚拟机上面的,要想访问到比较底层的与操作系统相关的就没办法了,只能由靠近操作系统的语言来实现。...如何实现克隆 先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。...这里写图片描述 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...这里写图片描述 在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现。

    97830

    Java提高篇——对象克隆(复制)

    本文目录 为什么要克隆? 如何实现克隆克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一个简单变量。...在Java中所有的类都是缺省的继承自Java语言包中的Object类的,查看它的源码,你可以把你的JDK目录下的src.zip复制到其他地方然后解压,里面就是所有的源码。...语言实现的代码,供Java程序调用的,因为Java程序是运行在JVM虚拟机上面的,要想访问到比较底层的与操作系统相关的就没办法了,只能由靠近操作系统的语言来实现。...简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。 ? 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现。

    89530

    如何复制一个java对象(浅克隆与深度克隆

    在项目中,有时候有一些比较重要的对象经常被当作参数传来传去,和C语言的值传递不同,java语言的传递都是引用传递,在任何一个地方修改了这个对象的值,就会导致这个对象在内存中的值被彻底改变...然后把这个克隆出来的对象公开给别人访问,这样保证了目标对象的封装和它的不可改变。那么怎么去克隆一个对象呢?    ...= friends; } public Set getHomes() { return homes; } public void setHomes(Set homes...= friends; } public Set getHomes() { return homes; } public void setHomes(Set homes...java有一个接口不太常用,可能很多人不知道这个接口是用来做什么的,下面就谈一下这个接口Serializable--序列化。

    4.2K10
    领券