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

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

然后把这个克隆出来的对象公开给别人访问,这样保证了目标对象的封装和它的不可改变。那么怎么去克隆一个对象呢?    ...首先举一个简单的对象克隆例子,有一个Person对象,它有三个属性: public class Person { private int age; private String name;...deepClone方法,该方法将对象序列化后再反序列化,然后得到了一个新的Person对象,下面来验证一下这个新的对象是否是完全的克隆。...这种序列化后反序列化的克隆方法,非常的简单,不需要再一一赋值,也不需要去一个个的实现clone方法,就可以完整的克隆出新对象,实在是大大有利于我们的开发工作。...该文章详细介绍了对象克隆,在大型项目开发中会很常用的一个功能点。

4.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

对象克隆 初探

对象克隆 对象克隆指的是对象的赋值操作 clone() 方法 protected Object clone() throws CloneNotSupportedException 创建并返回此对象一个复制副本...实现克隆操作 class Book implements Cloneable { // 实现 Cloneable接口,对象可以被克隆 private String title ; private...() throws CloneNotSupportedException { return super.clone(); }// 覆写 clone方法,调用父类的clone()方法,可以实现对象克隆...CloneNotSupportedException { Book book_A = new Book("Java",11.1) ; Book book_B = (Book) book_A.clone() ; // 克隆操作...完成 } } 对象克隆的理论价值高于实际价值 重点: 上述的代码中,提到了 标记接口 ,这个概念十分重要关键,标记接口好比一张口令卡一样,只有拿到(实现)标记接口(口令卡)才可以进入一些特定的地方

57510

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

要想对一个对象进行复制,就需要对clone方法覆盖。 为什么克隆 直接new一个新的不行吗?...克隆对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。...那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?...这时我们可以用序列化的方式来实现对象的深克隆。) 序列化就是将对象写到流的过程,写到流中的对象是原有对象一个拷贝,而原对象仍然存在于内存中。...通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆

2.9K42

Java的对象克隆

Object 类提供的 clone() 方法是 “浅拷贝”,并没有克隆对象中引用的其他对象,原对象克隆对象仍然会共享一些信息。...深拷贝指的是:在对象中存在其他对象的引用的情况下,会同时克隆对象中引用的其他对象,原对象克隆对象互不影响。介绍克隆要了解克隆的具体含义,先来回忆为一个包含对象引用的变量建立副本时会发生什么。...如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题、但是如果对象包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象克隆对象仍然会共享一些信息。...不过,通常子对象都是可变的,必须重新定义 clone() 方法来建立一个深拷贝,同时克隆所有子对象。在这个例子中,hireDay 域是一个 Date,这是可变的,所以它也需要克隆。...对象对于克隆很 “偏执”,如果一个对象请求克隆,但没有实现 Cloneable 接口,就会生成一个受检异常(CloneNotSupportedException 异常)。

58610

克隆一个对象——原型模式深入解析

甲买了一部iPhone并刻上了自己的名字“甲”,乙看到了以后也买了一部一模一样的,然后把名字改成自己的“乙”,对象one和它的克隆对象oneClone并不是同一个对象,但oneClone确实内部属性值与...= x 对象克隆对象不是同一个对象 x.clone().getClass() == x.getClass() 对象克隆对象属于一个类 x.clone().equals(x) 重写.equals方法...深克隆以后的对象与原对象是完全复制的却又独立的两个对象,而浅克隆以后的对象在引用变量上面,两个对象指向的仍旧是同一个内存地址。...原型管理器 原型管理器就是定义一个新的管理器类专门负责这个原对象类的克隆工作,这个管理器要保证单例(一般工具类都要保证单例,以避免多线程冲突),对外提供一个克隆访问点。...copy方法就是深克隆,是可以将所有数据复制一份过去的。 原型模式的适用场景 创建新对象成本较大,新对象与原对象又很相似,原对象稍作修改即可用。 有时候,复制一个对象要比构造函数方便得多。

70470

Java--对象克隆

因为Java方法中对象参数的传递是句柄(引用)传递,所以方法中对句柄的改动会影响到原对象。 很少调用一个方法来处理它的参数,在实际编程中也要避免改变参数的情况。...但如果我们需要在一个方法的调用期间修改一个参数,且不打算修改外部实体,就应该在自己方法的内部制作一个那个参数的副本来保护那个参数。 制作对象副本需要使用clone()方法。...它的存在有两个原因: 可能有一个上溯造型句柄指向一个基础类型,而且不知道它是否真的能克隆那个对象。在这种情况下,可用instanceof 关键字调查句柄是否确实同一个克隆对象连接。...考虑到我们可能不愿所有对象类型都能克隆。所以Object.clone()会验证一个类是否真的是实现了Cloneable 接口。...: 不实现 Cloneable 来试着防止克隆,并覆盖clone(),以产生一个违例。

71570

JS完美收官之浅克隆和深克隆

1996年7月5日,在英国爱丁堡市罗斯林研究所出生了一只克隆羊多莉,克隆英文名"clone",clone起源于希腊文"klone",也称为无性繁殖,克隆是生物体通过体细胞进行无性繁殖,最终形成基因完全相同的后代...,多莉与多塞特母绵羊具有完全相同的外貌,而我们程序中的克隆跟这类似,就是把一个对象中的属性复制一份放到另一个对象中。...浅克隆 什么是浅克隆?浅克隆就是当我把obj{}对象里面的所有属性拷贝到obj1{}中后,然后我分别改变对象里面的变量,原始值互不影响,引用值一个改变,另一个跟着变。...,另一个跟着变,这就是浅克隆。...深克隆(主要) 那什么是深克隆呢?深克隆就是修改引用值时,互不影响,你改我不变。

1.3K20

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

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

3.1K40

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

本文目录 为什么要克隆? 如何实现克隆克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一个简单变量。...要想对一个对象进行复制,就需要对clone方法覆盖。 为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?...答案是:克隆对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。...这时我们可以用序列化的方式来实现对象的深克隆。) 序列化就是将对象写到流的过程,写到流中的对象是原有对象一个拷贝,而原对象仍然存在于内存中。...通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆

86830

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

要想对一个对象进行复制,就需要对clone方法覆盖。 为什么要克隆?   大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?   ...答案是:克隆对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。...浅克隆和深克隆 1、浅克隆 在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象克隆对象的成员变量指向相同的内存地址...这时我们可以用序列化的方式来实现对象的深克隆。) 序列化就是将对象写到流的过程,写到流中的对象是原有对象一个拷贝,而原对象仍然存在于内存中。...通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆

91230

在 JavaScript 中如何克隆对象

当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。...若要克隆对象,请使用 Object.assign() 方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象一个浅拷贝。...正如我们所说,Object.assign()方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。 在这些情况下,必须对对象进行深拷贝。...我们创建了一个deepClone(object)函数,将想要克隆对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个对象,其中将从起始对象克隆的每个属性都将添加到该对象中。...具体思路: 如果该属性不是对象,则将其简单地克隆并添加到新的克隆对象中。

4.6K20

如何在 JavaScript 中克隆对象

如何处理 JavaScript 中的克隆对象JavaScript 处理对对象的赋值的方式与处理基本值的方式不同。它不是保存值,而是使用指向内存中值的指针。...这个概念被称为引用赋值,其中变量不存储实际值,而是存储指向对象内存位置的引用。这意味着如果两个变量指向同一个对象,对其中一个的任何修改都会影响另一个。...复制策略根据原始对象和具体需求,可以在两种复制策略之间进行选择:浅拷贝浅拷贝创建一个对象,只复制对象的顶层结构,而原始对象中的嵌套对象或元素仍然保持它们的引用。...使用 JSON.parse()/JSON.stringify() 克隆对象const weather= { today: '', forecast: { morning: '' }}const currentWeather...它在管理超出 JSON 范围的复杂对象方面表现出色,包括具有二进制数据或循环对象图的对象。尽管如此,结构化克隆确实具有一定的局限性。

15640

原型模式(克隆生成对象

正文 __ 继承__ 对于熟知面向对象开发的我们是再熟悉不过了,我们通常使用一个类继承另外一个类来实现对类中属性与方法的共享。...那么我们能否使用一个对象继承另外一个对象,来实现对象之间的属性、方法的共享呢? ? Java 类实现继承 程序员视角 思考: 如何建立对象级的继承关系?...于是我们想到了原型模式,即克隆对象并让子对象持有父对象克隆)的引用,借此来避免这个问题。 代码实现 声明原型链接口,用于实现如上图的聚合关系。...所以对于对象继承我们不可避免的要使用深拷贝,所以使用对象继承的一个显著的缺点:会产生大量的碎片对象(父对象)。...总结 原型模式的本质:克隆生成对象。 使用原型对象可以封装对象的创建过程,至于对象的初始化过程是否需要封装则依据使用者的需求决定。 原型对象会产生大量的内存对象,所以请勿过度使用原型模式。

46660

JS面试题】深克隆 和 浅克隆 有了解过吗?能手写深克隆吗?

克隆 和 浅克隆 有了解过吗?能手写深克隆吗? 什么是克隆克隆其实就是拷贝,就是把一个对象中的属性复制一份,放到另一个对象中的过程。而属性的数据是有原始值和引用值之分。...浅克隆:当我们复制对象中属性的时候,如果是原始值,则两个对象中的变量随意修改,两者互不影响(敌动我不动)。如果是引用值,一个对象的变量改变,则另一个对象跟着变(敌动我便动)。...深克隆:深克隆就是解决拷贝引用值时“敌动我便动”的问题,无论数据怎么修改,两者互不影响。...深克隆的实现有两种方式:递归拷贝和JSON函数拷贝,我会用这两种方式分别来实现深拷贝 递归拷贝:将obj克隆到newObj中 let obj = { name: "前端猎手",...[] : {}; //建立相对应的数组或对象 deepClone(origin[prop], target[prop]); //递归,为了拿到引用值里面还有引用值

1.5K10
领券