00:00
那接着呢,我们来看这个内容叫面向对象的特征是三多态性,那还是回归到咱们一开始说面向对象的三条主线,地调主线类和类的成员讲了三个了,还剩两个,下一章说,然后呢,这个面向对象的三大特征封装继承,这是我们讲的第三个多态性,然后关键字呢,这块我们还有一些关键字也是呢,在下一章当中,我们具体呢再来说,那这这块这个内容呢,主要就是第二条主线的多态性的啊,最后一个,呃,这个特征的这个最后一个叫多态性,好,那么什么是面向对象的特征叫多态性呢?这个特征呢,应该算相较于前两个来讲比较难的一个,就是不太好理解的一个,所以这块呢,大家得注意听,然后多态性呢,同时呢,也是比较重要的,也是比较重要的,这个呢,当然前提呢,都是基于你先懂什么是多态性以后你再看它的重要性,包括呢,它的具体一些应用场景,好,那下面呢,咱们就来提。
01:00
这这个多态性还是咱们呢,通过代码的方式呢,来体现这个多态性的一个使用这块的话呢,我们再去新建一个包,我这呢叫四在这呢,我们来说明这个多态性的这个情况,那为了方便呢,我们来讲这个多态性呢,首先我还是呢,先储备这样的几个类,第一个类呢,我们叫做person类,这个已经都很熟了,这里边呢,咱们再去提供它相应的这个属性。这呢我就写这两个,然后呢,关于这个person类的话呢,我再去提供他的这个方法,比如public word第一个E的方法。这样我们叫人吃饭好,接着呢,Public world来一个walk走路好,这呢是我们person类中提供的这样的属性和方法,那就这样了,然后接着的话呢,我们去提供这个person的这个子类,那我们换个子类,这个比如叫男人慢让他呢去继承于。
02:06
咱们的person进成1PERSON以后呢,就获取到person中声明的这个属性和方法吧,那同时的话呢,我们再添加慢当中所特有的一些属性和方法,这个比如我们加一个属性,男人加一个属性,判断他是不是smoking,是否抽烟或者是否喝酒啊都可以啊,加一个属性这个再加一个他这里边的方法,男人加一个这个钱的这money行,这个呢,我们写一下,说这个男人负责挣钱养家,想想就很痛苦是吧,对,女的就是负责办败家的哈啊,所以得得先养家才才能败。
03:06
再甲是吧,这个这块呢,我们就先写成这样,当然呢,你也可以对父类中的这两个方法呢进行一个重写,重写的话呢,我可以这样都给大家CTRLC粘过来,比如说这个吃,说这个男人这个养家不容易啊,你得多吃是吧,多吃肉长长也长肉,长长肌肉啊这吃然后走路,哎,这个男人或要霸气的走路是吧?行这呢,我就先声明一下,这两个方法的话呢,是对父类中方法的一个重写,那对应的有男人,我们就再加一个女人woman,让他呢去extend这个person,然后呢,也加上这个女人她自己有的这个方法和属性,比如说也加个波尔型的吧,波尔行是不是一个美女。
04:05
一个is beauty这样,然后加一个他自己的一个方法,就是花钱,花钱呢一般都得需要去逛商场,那叫购物shopping,现在有的时候商场也不逛了,直接呢就淘宝了,就啊,尤其双11的时候呢,一般都是很痛苦的一个事情哈,对男人来讲,嗯,所以你看那个抖音上在双11的时候出过几个视频,就是呃,一个呢,是那个女生定了个12点钟的闹钟啊,没没定闹钟是就差两分钟,然后睡着了,然后对醒的时候呢,已经过了12点了,然后就在那哭的呀,就感觉亏了亏了好多钱似的啊嗯,还有一个男的就是把他女朋友那个闹钟给关了,然后里边那购物车给清空了,其真真清空了,不是给都买了啊嗯,那个估计估计人身安全就很危险啊,这个go shopping我们输出一下,嗯,女人喜欢购物。
05:06
就是在这方面呢,男女确实好像不太一样,女生的话呢,主要这个体验的就是一种逛的过程啊,那男的话呢,一般都是想买什么直接就过去了,买完以后呢就撤,通常都是这种啊,嗯,那么女人这块的话呢,我们也对这两个方法呢进行一个重写啊,第一个这个要吃,吃的话呢,男人多吃,女人就得少吃,少吃就是为了减肥,这个女生的话呢,一般就是不管胖了瘦的,反正这个减肥的口号是一定要提出来减不减再说是吧,然后这个走路啊,女人那就是窈窕的走路,这俩字认识啊,嗯,行,那这样的话呢,我们就造好这样的三个类了,然后呢,我们写一个测试,通过这个测试呢,咱们来说明一下什么叫多态性,这我写一个叫person的一个test。
06:09
这叫叫面向对象特征之三叫多态性,这个多态性呢,用英文说呢,这个单词还比较绕口啊啊。Poly poism,不是poly mophism这样,这个呢,你也不用念了,你就直接说多太逊就行,你要是说个英文的话呢,可能面试官他也听不懂是吧,这个大家都没这样叫的,你就直接说中文就OK啊,面向对象的特征之三叫多态性,那下边呢,我们来展开一下说怎么算叫这个多态性,好,这个多态性,多态性叫多种形态啊,不能说叫多么变态,不是那意思啊,就多种形态,这我们可以先泛泛的去理解一下这个,这个理解一下叫多态性怎么理解呢?就是可以理解为叫一个事物的多种形态,一个事物的多种形态怎么来体现这个问题,那我们下边来看,那么在咱们讲这个多态性之前,咱们讲过这个寄生以后,咱们说呢,在我们的测试方法。
07:23
法当中,你呢可以去创建相关的对象,我呢可以去造一个比如说person的对象,P1用一个person,然后我通过这P1呢,我可以去调离一的方法,这呢是咱们讲第一天面养对象的时候呢,就提过的事儿,造一个类,造个对象,调个方法,这个呢比较简单了,然后讲完气征以后呢,我们可以再去造一个具体的像一个男人或者叫个慢了,哎妞一个慢,那这个慢里边呢,他一方面呢,是自己定义了一些方法,同时呢,它还继承了覆类中的一些功能,那我们像这个it的话呢,它重写过啊,这像覆盖了啊,属性呢,其实也类似的,这个你可以调一下这个副类中,你像我们这个A值,这是父类中这个生命的这个结构,比如说25岁这个权限呢,咱们现在没有没有没有考虑,所以呢,我这还可以直接呢去调这个所谓的属性,这呢都是父类中定义的,然后你自己呢,也定义过这个,我们叫这。
08:23
阿玛尼挣钱行,这块的话呢,跟多带性目前没什么关系,这上面这个人的,下边是这个男人的。跟我们这个多态性呢,目前没什么关系,然后接下来呢,我们说这个所谓的叫多态性,先画一条线,画一条线那么叫一个事物的多种形态,怎么来理解呢?大家看,现在呢,我左边呢,声明的是一个person,左边呢声明的是一个person,然后右边我们需要呢,给它赋个值,那负的这个值呢,相当于给它赋给一个person类型的一个变量了,那原来的时候呢,咱们声明什么类型,我呢就knew什么类型,原来knew的声明person就new person声明一个man,我就new个慢,现在呢,我们说我声明是个person,我可以不去new一个person,而是可以去new一个慢,你会发现呢,此时并不报错,那这儿呢,就是咱们所谓的多态性。
09:28
这个反而好像比前两个更更短是吧,多带星就快说完了,这就是多带性啊,正因为呢,看它比较短,所以呢,你很难理解它,这这什么意思是吧?啊,这个多态性呢,我们通常也把它称作叫做子类对象的多态性,或者说直接说就是对象的多态性,什么叫对象多态性,就是我们声明的是一个变量,然后当你右边呢,给他去提供一个对象的时候呢,这个对象呢,体现出来了多种形态。
10:02
我们要求要一个person,你这块呢,我new了个慢是一个对象,然后我也可以new一个woman,甚至你还可以有person的其他的子类,这个只要是person的子类,我呢都可以这块去用,而且呢都可以给它付给person,这就体现为右边呢是真实是你这个对象了,这个对象在提供这个对象值的时候呢,这个对象呢是多种形态的,就是这个意思,这叫对象的一个多态性,那用一句话呢来概括什么意思呢?就是这个父类的引用指向子类的对象,这儿呢就叫做对象的多态性。父类的引用,这个引用呢,就是我们这里边PR指向子类的对象,这个子类的对象呢,就是我们的newman,那相应的咱们说这个我person一个P3,我去new一个woman,这是不是同样的是多态性啊,这也是个多肽。
11:05
这是个多肽,这呢,就咱们所说的这个叫多肽性,你肯定这时候有疑问,说为什么要这样写这个,咱们一会说先呢,咱们知道什么是多肽,然后咱们再谈为什么要这样设计啊好,这呢我们第一个问题说这先是理解了啊,什么多态性,第二个呢,说何为多态性,哎,那这呢就是我们说的这个多态性,它的一个意思,何为多态性,就是一个what的一个问题,说什么是多态性啊,这呢,我们指的叫对象的多态性,就是将父类的引用指向子类的对象,这呢就是多态。如果呢,你去面试的时候说多肽,你能不能给写个代码,那你一定是可以写出来的,左边呢只要是一个父类的声明,右边呢,你拗的时候呢,别拗这个父类,你拗它的子类的对象,这就是多肽。啊,你也可以呢,把它称作叫子类的对象父给父类的引用,其实是一个意思的,或者呢,叫子类的对象父给父类的引用,其实一个事儿,嗯,子类的对象负给父类引用,父类引用指向子类对象一个事。
12:19
怎么说都可以,这呢叫对象的一个独裁性,肯定这时候大家还是比较这个这个迷糊的说,为什么非得要这样声明是吧,咱们先还是怀着这样的一个疑问呢,咱先接着往下讲,然后呢,咱们再谈,为什么Java呢,要做这样的一个规范有什么好处,这个咱们等会再说先呢,还是拿咱们说的这个,哎,这个P2来说事啊,那么我们现在呢,有了这个P2以后,我们接着往下谈,我现在呢,有一个对象的一个引用名了,那接下来我去点就可以调这里边的一些功能了。那这时候调功能的时候呢,比如说我调了一个方法。我调这个it方法,编译呢也不报错,这时候我们更关心的是我调了it到底执行的是哪里的方法,因为咱们男人呢,重启这个方法了,Person呢也定义过,那这时候就是父类的还是子类的?
13:16
这个就全看运行了是吧,运行了我们发现执行这个可能看不太清楚这块我们,嗯,在这加一个这个换行。哎,这呢,很显然调的呢,是子类重写负类的这个方法了,子类重写负类的方法,那这时候呢,我们再通过这个P2呢,我再去调这个还有一个叫work方法,那我们这个慢呢,也重写过了,这个很显然是不是也应该是重写的。啊,也是重写以后的没有问题,诶这呢其实可以大家看做呢,叫多肽的一个具体的应用了,相当于相当一个具体的多肽的应用,这呢就是一个多肽的一个形式了,下面呢就是相当于多肽的。
14:04
或者叫多肽的一个使用,使用什么意思呢?大家看到我们有了这样多肽的一个形式以后,我通过这个引用去调用子父类当中都声明过的这个方法的时候呢,发现真正执行的是子类重写父类的这个方法。把这个事儿呢,我们描述一下,就是当通过啊,或者叫直接说就当调用,当调用子父类这个同名同参数的这个方法时,我们说实际执行的是子类重写父类的这个方法,那我们把这个事呢,就称作呢,叫虚拟方法调用,这个大家先不用去深究,说什么叫虚拟方法调用啊,那这个一会呢,我们再详细的展开来说,具体表现的话呢,就是这个事。
15:02
就是当我们这个有了多带这个形式以后,我们调这个方法,这个方法呢,子类重写过,前提是重写过以后呢,我们去调的时候发现呢,调的是子类重写的这个方法。这个事呢,其实大家也可以形象点去理解,比如说比如说啊,我现在呢,说就是假设我有个秘书啊,我跟那个秘书说,说你给我叫一个人来,我现在呢就有点事需要安排,我叫个人,相当于呢,我左边呢就声明了一个人,你给我叫个人,这秘书呢,就相当于是我去右边呢可以复个职了,相当于是他就去找一个人,那他呢,有可能找了一个男人,也可能找了一个女人,那当然对于我来讲的话呢,我只需要他满足是个人就可以了,那找到这人以后呢,我说咱们一块出去吃点是吧,那这时候我就调这个吃的方法了,那这时候呢,如果这个人恰好你发现他是个男的,他就表现为是不是就很能吃啊,对,你要是恰好呢,诶叫来这个人呢,是个女的吃的就少一些啊,没有别的这个要求了就哈,嗯,所以说呢,这个医疗方法呢,我们实际执行的时候,就相当于是你真正去操作的时候呢,它掉的呢,都是子类这个。
16:15
重写的方法也是合理的,好这是这个情况,那这时候问一下,我们能不能通过P2呢,我去调这个右边这个慢,因为咱们这块用的是个慢,我能不能掉这个慢所特有的方法,咱们那个男人有特有方法,就是负责挣钱,我这调一下这个叫earn,这个一方写作直接C过来。大家发现呢,你看这时候是不是报错了,看一下信息,说这个earn money的方法呢,意思unDeFined for the type of person,说person类当中啊没定义过,Person类里边呢,说没有定义过这个方法,那言外之意呢,就是我们现在P2呢,我能调的是不是都得是咱们这个person里边声明过的方法,诶那像这样的功能呢,就不能再去调了。
17:12
不能再去调了,那这就是咱们刚才说的这个情况啊,那么有了这个多态的形式以后,咱们呢,通过这个引用呢,去调方法的时候呢,首先咱们编译的时候,像这这块呢,打不打叉就看编译了,编译的时候呢说哎,我们得是不是看左边声明的类型,对吧?编译的时候你得看一下你声明的是个什么类型,咱们才可以点出什么样的结构,编译是个person,所以我能调it,调work,编译时候你这个person没有这个方法就调不了,但是执行的时候呢,你又会发现呢,这个执行呢,又是我们此类重写的这个方法。你看我这个it,我现在按住CTRL键,我点一下,大家你你猜测一下我能点到哪类还是负类,会点到负类当中,你看是不是点到负类中了,这不就咱们刚才说的这个事儿吗?刚才肯定没注意听再说一遍啊,这个我们你调子类所特有的方法,你调不了,就是因为呢,咱们现在声明的是个person类型啊,你能点出来是不是只能是person里边声明过的呀,相当于呢,编译的时候呢,他不就认为你这个P2是一个person吗?那我这时候校验一下说能不能你看我这要写个一对一,肯定报错,因为没有定义过。
18:38
那是谁没定义过呀,对person没定义过,也就是说呢,编译的时候呢,它这时候呢,看的是你这个方法到底是谁的,是看左边的,所以我们这种点的时候呢,它就点到这儿来了。当我们真正运行的时候呢,你会发现呢,说啊慢里边重启了,所以呢,真正执行的又是执行的是这个慢里边的。
19:01
啊,就是编译呢,有点像,就刚才我说这个,嗯,找个人来,呃,潜意识当中我就知道这个人呢有吃东西的这个方法,因为我后边呢想找他去吃东西了,所以呢,我说你找个人来,哎,这时候呢,我要钓这个吃的方法了,因为人就有这个方法,所以我才可以钓,没有这个方法的话呢,我就钓不了,但是当我真正带着这个人去吃东西的时候呢,真正运行的时候呢,发现它表现为就是一个比较能吃的,或者呢不能吃的这样一种状态了,就是我们把这个程序相当于分成了两个状态。哎,一个呢就是编译式的状态,一个呢叫运行式的状态,就是在我们有了这个多态以后,啊这呢就是咱们下边要说的这个问题,哎相当于这个叫哎多肽的使用。哎,多带这个使用呢,具体来讲就是咱们所谓的叫虚拟方法调用这个事情啊,那具体怎么展开的话呢,我们这样说说呢,嗯,有了这个对象的多态性以后,就是我们所说的这样一种格式以后。
20:09
啊,这个嗯,有了对象的多带性以后,说我们在编译期说只能啊变异体只能叫调用父类中声明的结构,或者这呢,咱们是拿的方法说的啊,这也叫虚拟方法调用,咱就直接说方法了,说我们在编译期呢,只能调用负类中生命的方法,但这个在执行期或者叫运行期,这个我们实际执行的呢。啊,是子类重写父类的这个方法,能理解这个事吧,哎,能,那咱们把这个事儿呢,就做一个总结,这个总结呢叫编译,看左边,对运行或者叫执行呢,看右边是不是就很形象了,编译的时候呢,你看左边是什么类型的,然后呢,你这时候呢,编译就能调这个结构,没有的就调不了,运行的时候呢,看右边,右边呢是造了一个慢,所以呢你调了一个方法,实际呢就是重启的这个方法。
21:18
这呢就是咱们这个多态性的这个核心内容,一个呢就是它一个呢,就是我们这个叫虚拟方法调用,嗯,那再来写一个点,其实这个多态性呢,算是就讲的就差不多了,就啊嗯,感觉还没开始就结束了是吧?嗯,这个一会呢,咱们说这个它的作用啊,咱们先总结一下这个事儿,那这呢叫多态性,这是它的具体一个使用,那我们总结一下什么呢?叫多态性,它的一个使用前提。使用前提就是我们得得保证这两点能用的话呢,得有什么样的前提,第一个第一个的话呢,我们在这里边是不是提到一个父类,提到个子类啊,那就是首先第一个要有类的集成关系。
22:09
就是我们呢,讲继承的时候也提过啊,就是有了继承以后,我们才能够谈这个多态性,没有继承就没有多态性。你像你要没有继成我们右边呢,你也不会说出现有一个子类对象,因为像这样的方式呢,咱们不把它叫做多肽了,我用的是子类对象,这才叫多肽,那你就一定是得有子浮类了,这是第一个点,然后第二点,我们光有这样的关系的话呢,其实还不行,咱们呢要用的话呢,一定会调用这种所谓的重启的事儿。你像我这时候掉E的话呢,一定是子类重写的方法了,如果你要子类都没有重写过,那还是掉到person里的,那我可不就直接用个person得了,我用个person直接调person里的,那那多多方便啊,你这块的话呢,我这个编译的时候又认为是负类,运行的时候呢,又又给你转到子类调用,还挺麻烦的,哎,那这时候就相当于说我们这时候呢子类,既然你用的是个子类呢,运行的时候呢,还是子类的,那子类呢一一般情况下都会去重写父类的方法。
23:10
啊,所以第二个点呢,就是要有方法的重写,哎,正好的话呢,就是这个体现的就是我们说的这个这个事儿,这个方法的重写呢,就说的这个事儿,子类呢,通常都会去重写的,否则的话呢,我就没有必要去拗子类对象了,直接拗个父类的就完了。行,这呢是咱们说的这个多态性的一个核心内容啊,这个我知道大家比较迷糊,呃,先知道这个知识点是什么,然后我们下一个说为什么要有多态性。
我来说两句