00:00
打开我们的幻灯片,我们来继续学习,那么现在呢,我们来简单的说一下,当我们学完这个带有动态啊混入的方式过后呢,我们回忆一下,试看创建对象有几种形式啊啊,我们一起回忆,象第一种呢,就是我们另一个对象。哎,这是我们最经典的一种方式,六六个对象,第二种呢,就是apply,用apply的方式来创建对象,好第三种呢,就是我们去以这个匿名子类啊,匿名子类的方式来创建,还有一种呢,就是我们的动态混入啊,动态混入那么实际上呢,同学们啊。就是呃,不管是呃匿名子类还是动态混入,本质其实都差不多啊,最终呢,它是在底层都是按照我们JVMG去创建一个对象流程,只是从形式上看呢,有这么些啊,比如说面试官问你,诶看了有几种创建对象形式,你要能简单的说一下啊,再说一遍啊,形式上是有四种,但本质最终根归根结底那还是一样的,因为最终对象还是结为MG帮我们创建嘛,对吧?哎,这个大家应该清晰的。好接着呢,我们继续往下学一个重点叫叠加特质,那么叠加特质呢,这个是一个相对有点。
01:19
麻烦的,但是呢,用的也是比较多的啊,同学们,我们来看看叠加特质是什么,先来做一个基本的介绍来看。当我们构建一个对象的时候,或者叫混入啊,动态混入的时候,因为前面我们基本的我们讲了,我们是混入了一个特质,那现在呢,构建一个对象同时混入多个特质,我们叫做叠加特质,叫叠加特质,或者叫特质叠加。啊,这个叫法呢,可能有些要把这个特质协叫特质叠加或叫抵押特质都一样,那么这个时候大家要注意特质声明的顺序是从左到右,而方法执行呢是从右到左,那这句话什么意思呢?不好理解,对吧?什么叫生明从左到右,什么叫方法从右到左呢?看乙案例。
02:07
啊,这面的东西就多一点,大家看,为了把这个叠加特质给同学们讲清楚呢,我这里需要举一个例子,这面呢,我准备了一个案例,啊,这个案例呢,里面有很多这个呃,代码都非常简单,都是小块小块代码,我们来看一下我们来写这个应用案例的目的是什么,先说一下这个案例的目标或者它的作用,它的价值是分析叠加特质,是对象的构建顺序。和执行方法的顺序。OK,好,现在呢,我们来搞一个这个东西啊来。这个还叫混入,因为它本身还是动态混入衍生出来的一个问题,因此我还写在mix in里边,好朋友们,我们新建一个文件啊,叫爱的,我就剪一个叫爱的啊,爱的tree。那么S就代表我们加了很多的,或者加了很多这个特质,那么放进去。
03:02
好,来走一个案例。做一个案例,那么现在呢,我们这个地方研究的是看看啊,看看混入多个特质。特质的一个特征,特它的一个特点。那么混入多个特质呢?我们也叫叠加特质。叠加特色。好,那么为了快速的给他演示呢,我这里就不去写这种基本的代码了,基本代码我就不写了,拿过来用就行了,好吧,同学们看一下,我这里先写了一个锤子,这个大家一看就是个,就是一个特质,非常简单一个特质,这个特质里面呢,我在这写了一句话,同学们可以看到,也就是说我们这个特质它也可以直接在里面写东西。为什么这样理解呢?因为特质它有一部分也是类的东西,要抽象类的东西,所以说你在这写呢,其实大家应该马上反应过来,它在底层会生成一个构造器,里面有print,这个好说,这个呢是可以的,这个是一个抽象方法,这个是一个抽象方法,不说了。
04:08
好,紧接着呢,我们继续来写一个东西,这个有一个de塔四,一个进程,我现在在做准备啊,同学们做出准备,这个又是一个特征。这个特质干什么呢?他继承了,他继承了,他继承了这个OPER4。啊呃,我们知道特字之间是继承啊,特字之间是继承,同样我这也打了一句话啊啊也打了一句话,那么这个地方呢,我在这里重写了啊,准确的讲叫实现,也就是你地方这个可以拿掉,也可以保留,我在这里干什么呢?实现了。啊,这个叫法很多,有些叫实现,有些叫重写都可以啊没没有什么太大的区别,叫重写,所以他这也改了这个override好吧,啊干什么呢,这个insert方法。
05:01
没问题,因为我写了一句话叫插入数据啊,这个东西我重写了谁呢?他的operate。的这个方法,OK,这个咱们又写完了,就这个特质继承了另外一个特质,我们紧接着呢,来再来一个带四又继续继承。那么为什么要设计这么相对复杂一点呢?因为我只有多个特质,我才能看到特点,好,这又又是一个特质。这个特质干什么呢?他继承了啊特质啊特质。这个特质,它继承了这个东西。塔四。那也就是说,嗯,DATA4继承了OPER4,我D由DB4继承了DATA4 data塔四继承了OPER4,那么他们已经形成了一个三级的关系,好在这里面呢,我又继续重写了。那当然我这肯定是从呃是从带他四过来的,因此呢,我说这应该写它从实现或者从这个这个只叫这个叫真正的重写了啊这个地方这个override不能拿掉了。
06:09
这样拿掉他会报错。啊,你上面这个拿掉是可以的,为什么呢?因为你这个是候抽象的,我在以前讲过这个事儿,同学们注意这个语法啊,这一个你是真正的重写,人家这个地方就不能叫实现了,就是重写data塔四里边的映射方法。好,这个结构我先组织起来,好,之间的关系我们画一个图啊,待会再好,这个关系说完了,紧接着我们再来写一个。还有一个特质,因为我混住我,我必须要多几个特质才能看效果。好朋友们,现在呢,我又搞了一个特质出来,我们再看这个特质,这个特质它继承了,继承了代四。继承了四好这个地方呢,他又重写了,他也去重写了德尔塔四的insert方法,这个没毛病。
07:00
对吧,同学们好,然后还做了一件恐怖的事情,他做了一件什么事情呢?他调用了data式的in射的方法,对它在这里调用了。因为将来这个地方我们我们是一个知讲解的知识点。啊,我这个案例设计是有是有道理的啊,这边我调用了DATA4啊,调用了副类,不能说是DATA4,因为混入这个super就不一定是自己自己的副类了。好,所以说我应该这样调用了这个,呃,这个insert方法,到底这个inser的方法是指的谁。跟混入的顺序有密切的关系,我这加一句话,哦,OK,好,这个是个细节问题,我再说一下,这个是一个难点,就这个地方,怎么理解这个super,我要先说一句话,就这里的super。Super在动态混入时,在动态混入时不一定啊,不一定不不一定是不一定不一定是负累。
08:09
OK,那不一定是负类,那么我们现在这个关系就写完了,好,我把这个关系用一个图来描述一下,现在我一共有一个两个,三个,四个特质好关系我用一个图来描述,不然大家待会看起来比较吃力。啊,比较吃力,好打开我们的笔记里边有一个SC讲解示意图,打开一个。好,现在呢,我把这个叠加特质的一个案例的这个关系先聊一下啊啊特质。啊,叠加叠加特质的一个的一个关系示意图,关系示意图待会儿呢,我们这个就看得很清晰了,我把这个稍微的放大一点啊,大家看起来舒服一点啊好把这个放大一点,来一个15好,刚才我们这个关系是什么样子的呢?漏。好的,哪位老师看我这样写啊,这个地方有一个特质。
09:04
对,这有个特质。这个特质的名称是oper啊,我就我就粘过来吧。啊就粘过来是OPER4,不然大家大到时间听的比较吃力啊,这个OPER4下面呢,我有有一个子类啊,有一个有有继承它的啊,不能叫子类,就是代塔四去继承的OFFICE4。这个他继承了他。好,也就是说,呃,我们的代塔四呢,诶,我们代塔是干什么呢,他去继承了。这个op,但继承我们前面已经讲过了啊,继承这个是到底干了什么事大家知道,那么在data塔式里面呢,又延伸出来了两个特质。啊,两个特质,哪两个特质呢?一个是DB4R DB4,一个是FILE4。啊,他们两个呢,又去继承了,哎,又去继承了DB4和这个ADB4和这个,诶这个我再复制一份好,呃,一个简单关系先看清晰了。
10:13
也就是说是这么一种关系啊,就是说DB式继承了代式,代式继承了OFFICE4,那么这边又是一条分支,好有了这个基础以后呢,我们来再来往下继续走,这有个MYCYQ4,这个就是一个普通的类。这个就是一个普通类,大家看清楚了普通类,那么现在这个普通类我做一件什么事情呢?我要来进行多个叠加,大家看我的代码,我准备这么叠加一下啊同学们,代码非常简单,我这叠加了这么一句话,然后呢,我再来讲一下它的细节,看这里,嗯,我们来看这段代码是做了一件什么事情。下面的代码我做一点说明啊,我做一点说明第一点。啊,就是我同时混入了DB4,就是在创建。
11:00
创建MYSQL是实例史二实例。实力是我动态等混入了,混入了这个DB4和和方式,因为这个后面同学们用的比较多,所以说我们稍微慢一点啊,它动态混入了两个特质。那么DB4和F4呢,它是处于一个什么样的位置呢?处于这一层的。最底层的。啊,最底层好,有了这个这个关系,我们现在完,我们现在来研究第一个话题,我们现在研究第一个问题,或者来探讨第一个问题,啊,我们来研究研究第一个问题,什么问题呢?就是我们创建的这个动态混合的对象,它在构建的时候顺序是什么样子的。一定会有面试题,或者说将来复杂一点的代码一定会有这个东西,而且你们将来肯定会用到啊,研究第一个问题就是当我们我们哎我们创建一个动态混入对象对象时,其顺序其顺序顺序是怎样的?
12:14
怎样的好,我们来看一下,首先我们找到MYSQL,我们发现MYSQL是个空的,所以这个MYSQL呢,没有任何作为,所以说不去管它了,那么紧接着我们看它现在呢,先混入了DB4,那么在混入DB4的时候,他会做什么工作呢?同学们他会做一些初始化的工作,那首先我看DB是干什么事了。DB4这输出了一个这个东西,所以说他先去。它要去构建,它会把这个特质的构建的这些代码也要走一遍啊,因为在这个地方你可以简单的理解成DD4,它虽然是个特质,但是它也是有类的概念里面的,就好像我们一个类继承的时候,你们还回忆一下,你们原先在类继承的时候,是不是他先把父类这些东西先给你搞定了,虽然我现在是个特质,但是我也讲过,在刊里面特质也有类的概念在里边,他有抽象类吗?所以说他也会当做一个在这个创建时候,也会把它当做一个负类的这个概念来使用,那同样的道理,他会去。
13:18
更简单,但是他一看DB4呢又有DATA4,所以他又会找DATA4,发现DATA4呢又有个类4OPERATOR4,因此他首先执行的它,也就是说整个这个流程仍然是按照我们对象的那种构建来走的,那第一个应该输出OPER4。啊,这个大家要看清晰了啊,不然以后你代码看起来很吃力,第二个OPERATOR4做完了以后呢,他发现这个地方说输出塔四。好,这个做完了以后呢,第三一步,各位朋友代塔四做完了过后,输出DB4 OKDB4也OK了,好,这个DB4做完以后,同学们,DB4做完以后,这个混入的DBDB4这个就完事了,紧接着它继续混入。
14:05
继续混入,继续混入哪个呢?继续混入FILE4,继续混入四呢,我们看fair在这儿,诶他发现FAIR4也有一个负类问题来了。啊不不要复列复复复特质,那么他在去,他也想去做这个混,混入这个DB4,他发现DB4这个线已经被前面走过了,于是它就不会再走第二次,因为编译器在底层,它会做一个判断的。因为你的负类你不用,你不可能是把它往上走,走两次嘛,因为你最终是一个对象嘛,所以说这个时候呢,就不会再走了,直接把这个发拿过来。好。拿过来以后,这个时候这个创建的一个流程就完成了,我们来输出一下。好,我们来输这个MY式,好我们走一个代码运行一下看代码,好当我们看完代码跟我们发现这个没有任何问题,跟我们分析的是完全一样。
15:03
所以说在这个地方,大家要看这个流程啊,是opers DB式和完事,好最后我们总结一句话。啊,我们把这个案例说完了,我们总结一句话,什么话呢?好,这句话呢,我已经给他总结好了,我直接拿过来啊,因为时间关系,我就不这样子在叠加特质是首先从后面啊在在在这个叠加特质,首先从后面的特质开始。好,我把这句话拿过来再加点话啊,就是开。撕开了再叠加特质,首先从后面的特质开始读通事一及从及及从左,从左到右开始叠加。那你看这个地方DB4吗?DB4当然有同学说,老师如果MYSQL4也有,MYSQL是自己还继承了复联又怎么办,那就更复杂了,比如说啊,我我现在先暂时不写,假设MY是还有负类,他自己就这个家伙,他还其实有负类,那这个关系就变得更复杂,我们待会再说,再研究这个话题,先简单一点啊,就说大家看。
16:16
就是在叠加测试,首先从后面的特质开始积,从左到右,从左到右积怎么样呢?先搞定它,再搞定它。好,我们第一个顺序已经证明是正常正确的,下面我们再研究第二一个问题,啊,这个有点啰嗦大家,但是还是要讲清楚啊,啊研究第二个问题,什么问题呢?我们研究第二个,同学们以后用到第二个问题,就是当我们去执行一个动态。混入对象的方法时,它的顺序又是怎么样子的。当我们执行。注意听执行一个动态混入对象的。方法时的方法时其执行的顺序是什么样子的?来各位同学,首先呢,我们来给大家看一下直顺序,我用这个MYCY来调用一下insert。
17:14
OK,那么我输入一个100。我输入一个100好,那这个时候顺序是什么样子,我先给他做一个大概的介绍啊,注意在执行。再执行一个顺序式啊,顺序是。顺序是从反过来了,是从右到左开始执行。开始执行,这个有点像一个站一样啊,它这个底层有点像个站一样,就是我们这个函数加载,它是用站,就是最后进去的呢,哎,先执行。你要不停往不构建构建构建构建完了,构建往里面扔嘛,往里面扔东西,最后它执行的是从暂停开始执行。其实底层函数方法它是一个站,讲到这有些同学就知道了,我以前在讲这个构语言的时候,有个同学问了一个非常刁钻的问题,诶,他说为什么两个方法这个一起,那那个先执行先后进去的,后进去的反而先执行,我说这就站,他一下就明白了,其实这个地方就有点像个站,我们在构建时候把这个把这个内容并行往下压,压压压压,最后方法呢,最后那个方法其实是最上面那个限制性的,是不是这个道理,好,其实这个就这样子,那么我们来看顺序,第一步来看代码啊,第一步我们找到MYSQL最右面这个FILE4。
18:30
四那也就是说他先执行的是F4里面的方法哪一个呢?像文件这句话要执行。先执行这句话。好,也就是他先执行的像文件这句话。那么执行完了以后呢,各位同学可以看到这个家伙呢,又调了调用了一个方法,那家啊,各位同学啊。各位同学,他这掉了一个super方法。那么如果不掉呢,相当于这个线就断掉了。啊,这就不执行了,明白意思吧,就如果说你这没有的话,就他就不执行了,那么像文件过它掉了一个super insert。
19:05
那么这个super很诡异,这个super其实不再指的是他。为什么呢?因为刚才我讲过,他在共进的时候,他是先从左到右,其实此时此刻他的super在这个站里面,它那个夫人其实是他。左边这个家伙。我不知道这个大家能不能理解,因为它是动态构建的,它不是静态的东西,你不能认为它的这个super就是DB4啊,不不不是,你就不能认为它的这个super就是data塔式,因为这个它是动动态混顾的嘛,所以它在动态形成了一个类,那么这个类的这个关系层级关系呢,就已然发生变化了。如果同学们能听懂这个就很很很有意思了啊,那这个时候这个super是指的谁呢?好,同学们,这个时候super第二句话,当执行到super时,Super时是干什么呢?是。指的指的这个左边的,左边的这个特质。
20:07
Okay。他但是他执行到这个书本的时候,他发他在执行到书本的时候,他发现是其实指的左边这个特质,因为你这个对象,这个对象的它这个层级关系,其实这个是他,你可以理解成这个是他的类。因为你构建的时候,你顺序是这样走的吗。好,那这样子执行完了过后,我们来找左边,它是使用的是DB式,而不是塔式。啊,那DB是谁呢?找一下DB是哦,DBC是它里面有一个inert,于是他执行插入这个向数据库执行。有点有点有点郁闷啊,紧接着它又开始找,嗯,这个是像数据库好找到DB4里面它又掉了,输盘方法好又来了,那这个时候这个竖牌方法又怎么办呢?他又去找,诶这个地方还有没有没有了。再加一句话,如果找不到,才去执行负类的方法。
21:03
啊,这是刚才我们顺序第一点啊,同学们看,这是第一个顺序。是这样子的第二个顺序,那么第三个,第三个就是当直角书是是指的左边的特质好,第三句话如果在左边再也没有特质了,则是。自己的那个super,如果如果没有左边没有特质了,如果左边啊,左边注意听啊,左边没有特质,特质则。这个super就是自己的这个折啊折。则这个super super就是什么呢?负投资。负投资好,这个有点麻烦啊,但是呢,也其实并不是很难理解特质,所以为什么我经常跟同学们说,大家应该去学一下这个战能。底层它就是这样实现的,我可以告诉大家,如果你们有兴趣去追它的源代码,发现它底层是一个站啊,底层是个站啊,但是呢,这个同学们就看你的这个这个计算机的一个根底啊,功底怎么样的啊,啊同学们也不要着急,我给大家呃,在后面会分享一下这个构语言,构语言你们都可以什么都可以不看,你们就看最后那一部分的那个数据结构那一块东西,我讲了一个站。
22:18
讲了一个这个二叉树,讲了一个什么呢?链表就是环形链表,还有这个单向链表,还有这个双向链表,我全部讲了,还讲了一个什么哈希散裂,有同学你你不用需要太花太多时间,你你只需要花这个,假如拿个。半天来看,你整个这个水平,我刚才说啊,提高的还是比较明显的,但如果你以前学过这些,你可以不看了,说老师我以前就课本出身,对吧,我对这个数据结构算法非常了解,那你可以不看啊,如果你确实以前是零基础的同学,就零基础啊,以前就真的没有完全没有接触过这些,这些数据结构算法完全没接触,我建议大家看一下,时间也不会太长,最多你一天就看完了,但是你对这些东西理解的会深刻一点。好了,现在这个第三点我们讲到这,那就找到这些地方了啊。
23:05
那第三点我们刚才已经找到是DB4里边有一个,诶,他说有个书块,因为左边没有了,他就真的找自己书是成de塔四代塔式哪里呢?代塔式里面的确有个因素,于是它输输入了一插入数据,把这个ID1层一层传到这里面来。哎,你因为一层层传进来的吗?那就这个地方就输出IN10的数据库100,好各位同学这个执行顺序就完成了,那么我们来执行一下,看看是不是像文件,像数据库,还有插入数据库一块运行一下,看代码,同学们看代码走一个我们可以。这个什么玩意儿,这个啊,不好意思啊,这个我们把这个换一下行啊,不换行的话看不出来啊,我换一下行啊啊直接用LN吧。没有没有看到这个换行的效果,对不对,好把这个呢也换一下行啊各位同学。好,我们再行,再执行一把走。
24:03
啊,再进行一把,我们运行过后呢,看的是像文件,像数据库,插入数据100好到此一个就是混入的一个相对这么一个综合的案例啊,包括它的这个构建,包括它执行呢,我们就分析完毕了,如果要看底层的话呢,呃,同学们可以可以去,呃这样简单理解一下啊,就是说它构建的时候,这个MYMY是已经不是真正的MYS了,而是混入的一个新的对象,它的负特质你可以理解,这个是他的负,这个又是他的超级那个负,执行的时候呢,它是反过来执行的啊OK。好,这段代码我给大家先板述一下,到时先板述一下啊,待会儿我们再讲这个细节的问题,叠加测试还有几个细节我们待会再说。好,刚才我们讲了什么东西呢?诶,我们讲了这么一点东西。好啊,动态混入好来一个。二动态混入。
25:00
好,这个地方是讲的什么内容,看一下啊,动态混入六个,好,我们把刚才讲的内容做一个简单的板书。首先我给大家说了一下,我们。我们这个带特质混入的这个一个练习题,就是面试官问有哪几种方式创建对象,大家知道有四种形式啊,尽管底层都是一样的,但是呢,形式上还是略有差别。好先写到这里来,好一个是六对不对,哎,另一个对象apply用apply创建,哎,用apply创建,然后呢,用匿名子类的方式来实现,还有用动态混入,其实一个动态混入就是创建一个新的对象啊,它可以动态的改变你的个这个类的一个接关系。啊啊好,然后呢,这个说完了以后,我们又给大家讲了一个什么呢,就是叠加特质的基本介绍,诶叠加特征基本介绍,那么我们也给大家板书到这里,叠加特色来一个标题三。
26:01
啊,我先做了一个基本的介绍。那说了一个什么呢?我说了一个,我说了一个概念是什么叫做叠加特质,我说如果同时注意是同时啊,要分开那就不是了,同时如果混入多个特质,我们叫做叠加测试啊这么一个概念。啊,讲完这个概念以后呢,我们就立马来了一个应用案例,这个应用案例呢,代码是这样子的啊,我这也做了总结,那么这个叠加特质呢,我们举了一个小小的应用案例。对,这个应用案例是目的是干什么呢?各位同学请看我们的目的就来研究了一下对象的构建顺序以及。以及执行方法的顺序,对吧?好,那么代码呢,我们就给大家整理到例代码如下案例的代码。这是刚才老师写的代码,以及整个分析都到这儿了,注意啊,这个将来大家一定会用到。
27:00
一定会用到,因为我们将来写的代码不可能说只是混入一个啊,那你混入两个,混入三个,你自己流程都搞不懂的话,肯定是要蒙圈的。好,同学们,这个代码就说完了,好,截取一段视频。
我来说两句