00:00
看一下原型设计模式里面的前拷贝问题。呃,首先呢,我们这样子来说哈,就是前边我们写了一个案例,是关于原型设计模式的。那大家有没有考虑这样一个问题,同学们有没有发现我们这个C这些绵羊啊,它这里面的属性呢?啊,都是要么是字符串,要么是这个int类型对不对。但是没有对象,那如果说我这里有这么一个属性,大家先思考一下,比如说我这里有一个属性叫S,它有一个朋友friend,比如说我们。这个羊呢,这个羊它有一个属性叫friend,这个friend呢,是一个是什么呢?是一个类,也是个对象吧。就他的朋友呢,是另外一只羊。好,同学们想。那如果我们在进行这个原型拷贝进行克隆的时候,那么这个friend他会怎么去处理呢?来我们来看一下这个代码,那为了来演示这个代码呢,我们写一段代码来证明,好各位现在呢,我们这样做。
01:10
OK。我们怎怎么做呢,看啊S。点,给他一个friend。那为了嗯,简单一点哈,我这里就不做成私有的,当然我可以给个晒的方法,这里呢,我简单一点就把它做成public。我主要是来验证如果是对象在克隆的时候,在这个克隆时会如何处理。如何处理,就是说他在进行这个原型模式克隆的时候,呃,他会把自己的这个朋友是复制一份呢,还是说就让一个引用指向你已有的,这个就是把这个问题搞懂好吧,那现在我们这写成一个公有的,那就可以直接访问了点friend。怎么写呢?咱们new c,比如说这个汤牧羊的好朋友叫Jack。
02:05
呃,年龄的两岁是一个什么样的羊?是一只黑色的羊。同学们。那这样子的话,我们可以可以想象就是。呃,那么汤姆羊他就有一个朋友叫friend了。对进行克隆,克隆完了我我要讨论的问题就是。这个克隆过后的第克隆的这个羊,他的friend。是他的这个friend,这个对象,他是谁呢?就这个。she2.friend,点什么呢?Has code,我们来看看。克隆过后,在克隆的时候,这个这个friend会不会被被克隆?OK,我们来复制一份。那这个第三只克隆的第三只羊,他的朋友呢,也把他的friend打出来,克隆过后的第四只羊。
03:00
他的friend我们也打出来。第五只羊,它的friend我们也打出来。同学们可以想象。大家可以想,此时此刻他friend这个哈希code到底是一样还是不一样,我们运行一下。好,当我们运行过后呢,我们发现诶。有没有发现其实你克隆?你克隆过后这个对象。就是它的属性,如果是一个对象。其实没有真正的被复制。一份。他只是让你这个对象的引用指向了第一个对象的。那一个。对象属性指向的这个空间。也就是说类似于这样一种感觉哈,说我有一个对象。我有个对象,这个对象里面有个object。OK,这个object呢?它指向另外一个空间,比如是B,它指向这个对象。
04:00
那你克隆A2过后。那么你这个对象就是奥杰,不是也扣了一份吗?但是它是指向这个地方的。而并没有像我们想象的那样说,哎,我也克隆了一个B这样对象,然后让这个object只用它,不这样子的。所以说我们默认情况下,其实是第一种情况,那这个情况就叫前拷贝。前拷贝,那么我们来看看前拷贝它的概念是怎么说的。对于数据类型是基本数据类型的成员变量,前拷贝会直接进行值传递,也就是说将属性值复制一份。那么对于数据类型是引用类型的数据类型的成员变量呢?比如说成员变量是某个数组或某个类的对象等等,那么前拷贝则会进行引用传递,也就是说只是将该成员变量的引用值在内存地址复制一份给。新的对象,因为实际两个对象的该成员的变量都指向同一个实例,就是刚才我说的,那么在这种情况下呢?在一个对象中修改。
05:11
该成员变量会影响到另外一个。对象该成员变动的值,因为你指向是同一份空间嘛,因此我们前面讲的克隆羊其实就是前拷贝。因为你前拷贝用的就是一个简单的克隆方法,好同学们关于前前拷贝就这样子的。那问题来了,在实际开发中,我们有没有一种可能性,就是要求如果你的数据类型是引用类型?我们也希望复制一份,就好像刚才我说的,你这有个A1A对象。它指向了,它指向了。呃,一个B对象,它有一个属性是指向B对象,那么我们在进行克隆,克隆成一个22A2对象的时候呢,我们希望它指向的这个对象呢,也被刻录下来。
06:01
他也向他所以说这样才是。这这种形式呢,我们就称之为深拷贝。深拷贝,好,那么我们来看看深拷贝它是一个怎样的。概念。所谓深拷贝,他指的是复制对象的所有基本数据类型的成员变量值,这是第一个要求,第二个为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量。所引用的对象,也就是说连引用对象也要拷贝一份,直到该对象可达到所有对象。也就是说对象进行深拷贝时,要对整个对象进行拷贝,包括是引用类型的。OK。那么深拷贝在我们实际开发中有两种实现方式,第一种呢,是通过克隆来实现深拷贝,第二种方式呢,是通过对象序列化来实现这个深拷贝,那这两种方式呢,我们都为大家来进行一个讲解,OK,好,那关于深拷贝和浅拷贝的概念先聊到这儿,下面呢,我们准备代码给大家实验一把。
我来说两句