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

面向对象复制与浅复制

前言: 基于面向对象思想,大部分类都可视为“工具”。那么对于工具使用,我们总是期望能高效而又方便。特别是当我们在重复实现某些功能时候,那有没有一种能快速复用类捷径呢?   ...其实,这就是所谓“浅复制(shadow copy)”。其大概意思指的是对实现了Cloneable接口对象进行克隆时候,值对象可直接复制,而引用对象只是复制其“引用”而已。...所以,才会出现最后h3set操作改变了前面h1和h2设置wall.color属性。具体,可参考下图: 图一:浅复制 思考一下,如何实现“复制”?...即在复制基本类型同时,还能复制引用类型做指向对象。 解决方法是这样,首先得确定引用对象实现了Cloneable接口。然后,我们重写House类clone()方法对引用对象同样进行克隆操作。...最后将其set回house对象,这样便实现了复制

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

    JS 数组、对象拷贝

    博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象对象数组拷贝,就有浅拷贝和拷贝之分 浅拷贝就是当改变了拷贝后数据...a // { name: 'krry' } b // { name: 'lily' } --- 以上是简单数组、对象拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到拷贝方法...以上只能达到数组、对象第一层==拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向==同一个地址== 所以当改变数组、对象数组元素或对象,原数据依然会改变...二维数组、对象数组、多层对象拷贝 最常用 JSON 序列化与反序列化 使用 JSON.parse(JSON.stringify(obj)) let a = [1, [2, {aa: 2}, [4...(key)) { if (typeof obj[key] === 'object') { result[key] = deepCopy(obj[key]); // 递归复制

    8.2K30

    Java对象克隆与浅克隆(对象复制

    而通过clone方法赋值对象跟原来对象同时独立存在。 4 咋实现克隆? 浅、克隆主要区别在于是否支持引用类型成员变量复制。...浅克隆 如果原型对象成员变量是值类型,将复制一份给克隆对象 如果原型对象成员变量是引用类型,则将引用对象地址复制一份给克隆对象, 即原型对象和克隆对象成员变量指向相同内存地址。...克隆 克隆中,无论原型对象成员变量是值类型还是引用类型,都将复制一份给克隆对象克隆将原型对象所有引用对象复制一份给克隆对象。 除了对象本身被复制外,对象所包含所有成员变量也将复制。...这时我们可以用序列化方式来实现对象克隆。) 序列化就是将对象写到流过程,写到流中对象是原有对象一个拷贝,而原对象仍然存在于内存中。...通过序列化实现拷贝不仅可以复制对象本身,而且可以复制其引用成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现克隆。

    3.1K52

    js 数组对象拷贝

    以上是背景,所以我就对浅拷贝和拷贝进行了总结: 浅拷贝 什么是浅拷贝:两者是指向一个对象对象浅拷贝 1、对象直接遍历赋值。...数组浅拷贝 (两者指向不同对象,但是只能拷贝一层) array.concat(); array.slice(0); 如果该元素是个对象引用 (不是实际对象),slice 会拷贝这个对象引用到新数组里...两个对象引用都引用了同一个对象。如果被引用对象发生改变,则新和原来数组中这个元素也会发生改变,所以是浅拷贝。...拷贝 (下面说拷贝是基本对象拷贝,不考虑对象复杂属性,比如set,get,Function等) 1、最简单方式 JSON.parse(JSON.stringify(Obj)) 这种方法使用较为简单...,可以满足基本拷贝需求,而且能够处理JSON格式能表示所有数据类型,但是对于正则表达式类型、函数类型等无法进行拷贝(而且会直接丢失相应值)。

    4.7K30

    javascript 数组以及对象拷贝(复制数组或复制对象方法

    javascript 数组以及对象拷贝(复制数组或复制对象方法 前言 在js中,数组和对象复制如果使用=号来进行复制,那只是浅拷贝。...对象拷贝相比数组也没有困难许多,列举两个方法。...} = obj obj.old = '22' console.log(obj) console.log(obj2) 运行结果如下: 小结 数组和对象拷贝是js中最常见应用。...理解各种方法是必须。希望对大家有所帮助。 本文中并没有对异常进行处理,主要在讲原理。更多数组以及对象操作方法,可以参考lodash源码,查看它源码可以让你js基础变得非常牢固。...2017年10月31日补充,使用es6提供扩展运算符方法实现拷贝,简单,高效。并且,对象拷贝不会像使用 JSON 方法拷贝一样,丢失函数等信息,只能用来拷贝 JSON 数据格式对象

    3.1K10

    Vue实现对数组、对象拷贝、复制

    当组件间传递对象时,由于此对象引用类型指向都是一个地址(除了基本类型跟null,对象之间赋值,只是将地址指向同一个,而不是真正意义上拷贝),如下 数组: var a = [1,2,3]; var...a = 20; // obj2.a改变了, alert(obj.a); // 20,obja跟着改变 这就是由于对象类型直接赋值,只是将引用指向同一个地址,导致修改了obj会导致obj2也被修改 所以在...vue中,如果多个组件引用了同一个对象作为数据,那么当其中一个组件改动对象数据时,其他对象数据也会同步改动。...有这种双向绑定需要的话,那么自然是最好,但如果不需要这种绑定而希望各组件对象数据之间相互独立,即是互不关联对象副本的话,可以用下面的方法解决 computed: { data: function...var obj={}; obj=JSON.parse(JSON.stringify(this.templateData)); //this.templateData是父组件传递对象

    10.3K60

    JS专栏】JS对象浅拷贝与拷贝

    浅拷贝 自己创建一个新对象,来接受你要重新复制或引用对象值。...如果对象属性是基本数据类型,复制就是基本类型值给新对象;但如果属性是引用数据类型,复制就是内存中地址,如果其中一个对象改变了这个内存中地址,肯定会影响到另一个对象。...1. object.assign object.assign 是 ES6 中 Object 一个方法,该方法可以用于JS 对象合并等多个用途,其中一个用途就是可以进行浅拷贝。...浅拷贝只是创建了一个新对象复制了原有对象基本类型值,而引用数据类型只拷贝了一层属性,再深层还是无法进行拷贝。...拷贝则不同,对于复杂引用数据类型,其在堆内存中完全开辟了一块内存地址,并将原有的对象完全复制过来存放。 拷贝后对象与原始对象是相互独立、不受影响,彻底实现了内存上分离。

    2.3K40

    php5对象复制、clone、浅复制复制实例详解

    本文实例讲述了php5对象复制、clone、浅复制复制。...也就是说,浅复制仅仅复制所考虑对象,而不复制它所引用对象。相对于“浅复制”,当然也有一个“复制”:被复制对象所有的变量都含有与原来对象相同值,除去那些引用其他对象变量。...也就是说,复制把要复制对象所引用对象复制了一遍。复制需要决定深入到多少层,这是一个不容易确定问题,此外可能会出现循环引用问题,这些都必须小心处理。我们方案2将是一个复制解决方案。...方案2:利用串行化做复制 PHP有串行化(serialize)和反串行化(unserialize)函数,我们只需要用serialize()将一个对象写入一个流,然后从流中读回对象,那么对象就被复制了。...注意使用此方案时我们无法触发__clone魔术方法来完成一些附加操作,当然我们可以在复制之后再进行一次clone操作来触发__clone魔术方法,只是会对效率些小影响。

    1.2K50

    复制与浅复制

    首先直接上结论: —–复制,即将被复制对象完全再复制一遍作为独立新个体单独存在。所以改变原有被复制对象不会对已经复制出来对象产生影响。 ...—–而浅复制要分两种情况进行讨论: 1)当浅复制值是不可变对象(数值,字符串,元组)时和“等于赋值”情况一样,对象id值与浅复制原来值相同。...有两种情况: 第一种情况:复制 对象中无 复杂 子对象,原来值改变并不会影响浅复制值,同时浅复制值改变也并不会影响原来值。原来值id值与浅复制原来值不同。...第二种情况:复制对象中有 复杂 子对象 (例如列表中一个子元素是一个列表),如果不改变其中复杂子对象,浅复制值改变并不会影响原来值。 ...copy(浅复制)对于一个复杂对象对象并不会完全复制,什么是复杂对象对象呢?就比如序列里嵌套序列,字典里嵌套序列等都是复杂对象对象

    75120

    C#中复制和浅复制(在C#中克隆对象

    关于对象克隆所设计到知识点 浅拷贝:是指将对象所有字段逐字复杂到一个新对象         对值类型字段只是简单拷贝一个副本到目标对象,改变目标对象中值类型字段值不会反映到原始对象中,因为拷贝是副本...改变目标对象中引用类型字段值它将反映到原始对象中,因为拷贝是指向堆是上一个地址 拷贝:拷贝与浅拷贝不同是对于引用字段处理,拷贝将会在新对象中创建一个新对象和         原始对象中对应字段相同...浅复制: 实现浅复制需要使用Object类MemberwiseClone方法用于创建一个浅表副本 复制: 须实现 ICloneable接口中Clone方法,且需要需要克隆对象加上[Serializable...//return this.MemberwiseClone(); //浅复制 //return new DrawBase() as object;//复制...改变目标对象中引用类型字段值它将反映到原始对象中,因为拷贝是指向堆是上一个地址; 拷贝:拷贝与浅拷贝不同是对于引用字段处理,拷贝将会在新对象中创建一个新对象和原始对象中对应字段相同

    67710

    javascript 数组复制和浅复制

    这段时间忙我是欲仙欲死,导致公众号断更了好几天。 但收获也是巨大,对于JS一些应用有了一些新理解,以后我慢慢写出来。 今天简单写一个javascript里数组复制和浅复制。...首先通过for循环,给arr数组添加了内容, 然后声明变量arr2并把arr值赋给它, 这看起来像是复制了一个数组, 毕竟console.log打印出来值, 显示arr和arr2值是一样, 但这是一种假象...你看arr[0]='xx', 我们对arr数组进行了操作, 然后再次用console.log打印arr和arr2, 就会看到arr2数组也被修改了, 这就是“浅复制”,被复制只是数组对象引用。...现在我们再来看一下复制: 先看代码: ?...这就是复制

    1.3K50

    iOS中复制复制

    引 当谈到对象复制时都绕不开浅复制复制区分,它们是什么意思呢? 浅复制:只复制对象指针,两个对象指向还是同一个地址内容,操作一个时会影响另一个值。...复制复制对象内容,两个对象指向两个不同地址内容,操作一个时不会影响另一个值。 在OC中,因为采用内存计数方式管理内存,所以浅复制时会对同一个内容计数加一,复制则不会。...在OC中,当你对一个集合对象复制时,这个复制只是单层,集合内元素对象其实还只是引用,并不是每一层都是复制,这一情况,苹果定义为单层复制(one-level-deep copy)。...先说说简单复制复制,其实与非集合对象差不多: 对于不可变集合对象(如NSArray),copy操作是浅复制,只会复制指针,mutableCopy操作是复制, 对于可变集合对象(如NSMutableArray...),copy和mutableCopy都是复制,都会创建一个新同样内容来返回,但是要注意两点,一是copy返回还是不可变对象,二就是上面说,这个复制只是单层复制,里面包含元素还是指针浅复制

    52220

    PHP复制与浅复制

    PHP5使用了Zend引擎II,对象被储存于独立结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。...在Zval中仅存储对象指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。...仅仅保持相同对象指针并由另一个zval通知现在这个特定对象指向Object Store。...由于对象本身位于Object Store,我们对它所作任何改变将影响到所有持有该对象指针zval结构----表现在程序中就是目标对象任何改变都会影响到源对象。....因此我们复制”失败了。看来直接变量赋值方式并不能拷贝对象,为此PHP5提供了一个专门用于复制对象操作,也就是 clone 。这就是对象复制由来。

    69410

    浅谈JS对象拷贝和浅拷贝

    浅拷贝和拷贝'深浅'主要针对对象‘深度’,常见对象都是'浅',也就是对象属性就是单个属性,而''对象是指一个对象属性是另一个对象,也就是对象里面嵌套对象,就像嵌套函数一样。...如果现有var obj1 = {...}这个对象,想要复制对象obj1,一贯做法就是obj2 = obj1,这时虽然obj2拥有了obj1所有属性,但obj2却不是自由,因为它改动会影响到obj1...,obj1改动也会影响到obj2,这不是我们所希望,所以要用到拷贝和浅拷贝。...拷贝和浅拷贝就是为解决对象直接赋值后依然'连接'问题,也就是共用一个引用,一个改变会影响到另一个。...这时候拷贝就该上场了,它能用递归思想继续深挖,直到最底层为止。

    6.8K20

    js对象直接赋值、浅拷贝与拷贝

    这里就是出现了题目所谈到问题,涉及到了js对象直接赋值、浅拷贝与拷贝。 直接赋值   把一个对象a赋值给一个对象b相当于把一个对象b地址指向对象a地址,所以,他们实际上是同一个对象。...图3 浅拷贝,赋值对象与被复制对象不会指向同一个地址   修改赋值后对象b对象属性,不会影响原对象a对象属性;修改赋值后对象b对象属性,却会影响原对象a对象属性,如图4所示。...图6 concat方法实现浅拷贝 拷贝   拷贝会另外拷贝一份一个一模一样对象,但是不同是会从堆内存中开辟一个新区域存放新对象,新对象跟原对象不再共享内存,修改赋值后对象b不会改到原对象a。...很明显,拷贝比较符合我这次业务需求。拷贝,比较笨一点办法就是将自己需要数据自己封装起来。       ...有一种非常简单方法就是序列化成为一个JSON字符串,将对象内容转换成字符串形式,再用JSON.parse()反序列化将JSON字符串变成一个新对象,这样原对象就与复制对象没了必然关系。

    4.3K20

    python 复制和浅复制详解

    ,那么它指向地址就改变了 值和地址相互对应(int,float,complex,long,str,unicode,tuple) , 元组 tuple就属于不可变对象 基本可变对象复制和浅复制 基本可变对象不仅仅只有列表...基本不可变对象复制和浅复制 元组 tuple是不可变对象,只要地址改变其中值也会改变,因此 复制和浅复制 都不会改变其中元素地址。...但是对于嵌套对象,只要其中包含 可以引用可变对象复制就会重新分配内存创建新对象 。...由于外层是元组对象,是不可变对象,浅复制则不会重新分配内存。 这里是 复制和浅复制区别之一。 而这里浅复制不改变地址操作,也就表示操纵浅复制对象也可以对原始对象进行操作。...但是复制不会有这种担忧,里里外外都是重新从内存中申请空间,都是一个全新对象。 可以认为对于嵌套类型结构,复制都是重新分配空间,建立原来完全不同对象。 建议平时用复制,不易出错~!

    78720
    领券