00:00
好,那么这个事儿的话呢,我们就可以收起来了啊,哎,那么哎稍微的总结一下啊,到目前为止呢,我们是讲了这样的几个问题啊,基于这个继承性。哎,我们讲了方法的重写。哎,然后继续继承性,哎,我们里边呢,讲了这个super关键字啊,继续继承性啊,我们说创建一个子类对象发现呢,它还得加载父类的结构。啊,提到了此类对象实例化的全过程。好,那么这儿呢,其实都算是一个体系的。啊,大家下来呢,熟悉熟悉啊,其实浓缩一下的话呢,这个知识点其实也不算太多啊,我们平时常用的呢,其实就是一些最基本的啊,咱们上课讲的其实比较细了啊,把一些极端情况来说了说。好,那么接着的话呢,咱们学一个新的知识点。啊,一看这个名呢,就感觉挺复杂的是吧,啊polyphism。诶翻译过来呢,就叫做多态性。好,这呢是面向对象的第三个特征,也是咱们讲三个特征里边啊,最难理解的一个。这个多肽性呢,其实也是基于继承性的,为什么这么讲,那咱们就下边来看啊。
01:05
哎,首先呢,我这里呢,放了一句话,哎,大家可能听说过的啊,说1000个读者眼中啊,有1000个哈姆雷特。啊,这个是一个。小说的人物了是吧?啊,因为每个人对他理解都不一样啊,其实呢,就体现为呢,就是多种形态了。哎,我们这里边儿这个多态性,其实名字呢起的挺好的啊,这个多态性啊,其实理解为就是一个事物的多种形态。好,我这写一下啊,如何理解,如何理解多态性啊,就是呃,理解为。啊,一个啊,事物的多种形态。啊,这句话好像有点抽象是吧?哎,接着我给大家去举举这个例子哈。呃,举例的话呢,呃,比如说这个这个嗯,你的这个女朋友是吧。哎,女朋友说什么呢?说哎,我想养一个宠物。
02:00
没了,他给你暗示呢是吧,哎说养我想养个宠物,你可以理解成呢,就我们现在呢,要生明一个变量,这个变量就是叫宠物。然后呢,等号右边是不是得负个值啊。那你说有一个东西叫宠物吗?没有是吧,哎,那就是咱都理解啊,你这整个小猫啊小狗啊。整一条蛇呀是吧,口味重一点是吧,诶都可以理解成这叫宠物了,哎就说白了就是,诶宠物呢,如果看成是咱们这个变量的类型的话。真正你负责这个值啊,实际上呢,是一个具体的宠物了是吧,一个小猫一个小狗,这叫具体的了,哎,那就相当于是我声明的是一个宠物,实际的话呢,他也没有说,他就想想养猫想养狗,假设呢,他就喜欢猫,你突然呢送了他一条狗,他说我就不想要狗是吧。那当然你做的这个事儿是没问题的,因为他说宠物他没说明白。那你给的这个小狗呢,那也是属于宠物的一种,就是因为呢,有多种形态嘛,他没说具体是吧,诶所以这是一种场景啊,好这块呢,比如说啊,你的这个这个孩子说是吧,哎,我想。
03:07
啊,这个要一个玩具。啊,他想要个玩具,他也没说是什么玩具。那这块呢,是不是又有多种形态了是吧,啊,你整个这个变形金刚也行。奥奥,奥特曼也行是吧,对,整个什么都可以啊,这都算是一个玩具。啊,但是一般孩子这块呢,通常他没有特别的要求哈,就是基本上你给他整个啥他都很高兴。对,其实呢,跟孩子接触多了以后呢,会发现。孩子真的是就是他的那种开心,他真的是发自内心的开心呐。就是你给他整个小东西,他就特别开心啊,大大笑就发现呢,我们长大以后呢。好像基本上没怎么笑过是吧,笑的时候呢,反而有点假是吧,啊OK啊,所以呢,孩子这个这个。保持一种童真的心也是挺好的一个事儿啊。好,这是说的这个他好,那么还有可能比如说这个老板是吧。
04:03
诶,老板说一句,说这个,诶张秘书是吧。啊说呢,这个,呃,安排一个同事啊,说安排一个比如说技术科的。啊,技术科的。啊,技术课。的这个同事啊,诶跟我一起。呃,下周出差是吧。行,他这块呢,提了一个点说呢,要一个技术科的同事,你可以理解成呢,这块就诶明确了一个这个变量啊,变量类型呢,诶确定了就是技术科的一个,但是技术科呢,可能人很多,哎,到底是这个张三去啊,李四去啊,王五去啊没确定,所以你具体负的这个值呢,他就。有区别了。哎,所以这块呢,你看表现的具体的形态呢,也不一样。啊,也不一样好,那这呢就是我们生活当中关于这个多态性的一个理解了。哎,那我们这个代码层面啊,实际上跟这个生活中,我刚才说这几个情况啊是一样的。啊是一样的,比如说你看我这块呢,比如说想声明一个,呃,我需要一个人啊,我这块比如就声明是个人了,但实际上的话呢,我们给这个人赋值的时候呢。
05:08
我负的呢,不是new的一个person。而是new的一个person的子类的对象。哎,这就是我们讲的Java代码层面的这种多态性。诶一下子倒过来有点懵了是吧,诶这块咱们就写写这个代码了,你看看跟咱们生活中这个啊,诶是一个道理,看能不能体会这块呢,为了营造这个多态性,那咱们呢,就提前准备这样的几个类了啊首先呢是person类,是咱们最熟悉的啊人。还是我们最熟悉的这几个属性啊,Straight name啊,Age,再来两个方法。啊,吃和睡是吧。啊,这个呢,叫人吃饭。哎,Public word来个sleep。哎,这个,哎,人睡觉。
06:01
好,这呢是我们造的一个类了,然后基于这个场景呢,我们接着呢,创建两个子类吧,所以你看啊,我们想演示多肽的话呢,都是基于这个继承性的。好,这个慢呢,继承于这个person了,继承完以后的话呢,他就拿到了person里边生命的属性和方法,这个权限我就没写了啊,哎,那么除此之外呢,慢可能还有自己特有的属性。嗯,加一个。比如叫哎布尔类型的叫is smoking吧。哎,是不是抽烟是吧?呃,然后呢,你可以对负类中的方法呢,进行一个重启。哎,这块呢,拿过来,哎这个吃的话呢。哎,这个我们叫男人。哎,这个多吃肉吧,啊长。肌肉。嗯,也可以让这个肉都长到这个腹部了是吧。嗯,这个睡觉呢。睡觉这个这个咋整。这个我们给换一个这个吧,比如说走路。这人走路。
07:00
哎,这个呢,俩人走路,那咱就换成一个。就是这个,哎。嗯,笔挺的,走吧。是吧?好,这呢是我们这个呃慢里边呢,呃重写复类的两个方法了,然后呢,自己再额外的增加一个方法。哎,Public word啊,加个什么方法呢。说这个叫挣钱的方法。啊,这个男人啊,挣钱。养家是吧?少个小括号啊。哎,这么着好,这呢是自己额外的一个方法了,这个是男人好,那对应的我们再来一个女人是吧。诶woman啊,然后他呢,也是继承于我们的person没问题,诶首先多一个属性。做一个什么属性呢。长发是吧,来一个比如说这个吧,哎,是不是一个美女啊。哎,Is beauty啊。嗯,然后呢,对于负类的这两个方法呢,做一个重写。C。
08:00
张过来,这个呢,哎,女人。啊,女人啊,应该呢叫少吃。减肥是吧。哎,女生呢,不管胖还是瘦呢,就是都得是要减肥是吧,原则呢就得摆出来啊。啊,走路呢。比如说这个叫哎窈窕的啊。哎,走路。哎,这样啊,然后呢,再多一个方法。啊,一个挣钱一个花钱是吧,啊行花钱呢,咱们就是在一个场景当中,就是逛商场是吧,哎购shopping啊。哎说哎女人喜欢啊,这个逛街是吧。其实女人喜欢逛街这个事儿的话呢,还是有有有什么。有章可循的哈。这个怎么讲呢?嗯。对,你看女生只要不舒服的,这个心情不好的时候呢,就是拉着一个闺蜜啊,怎么着就去逛街了哈,逛完街以后呢,她可能什么也没买。回来以后呢,感觉心情就好多了是吧,哎,男生的话呢,你要是难受的或者不舒服的时候呢,一般不会逛街吧。
09:03
哎,不会是吧,这个男女还是不一样的哈,哎,包括呢,你看那个钓鱼。都是男的去钓鱼,基本没有见过女生钓鱼是吧?对,很少啊,极少,呃,什么原因呢?其实还看过一本书,里边写的还是挺有道理啊,所以男人喜欢钓鱼呢?是因为这种场景呢,特别符合古代的时候呢,男人这种狩猎的场景。啊往这咔一蹲,蹲了一天是吧。一个猎物也没来是吧?啊,诶你钓鱼的话呢,就是这个就静静的在这就等是吧,啊就这样一种场景,然后呢,女人呢,古代的时候呢,这个生产力水平也比较低,然后也没有那么多的这个工具了,那就是摘一些野果嘛,是吧。啊,摘摘苹果呀,啊,采点什么东西呀,哎,那跟现在逛街呢,是不是场景就很像?摸一摸呀是吧,看一看呀,哎,心情就挺好的是吧?哎,这都有章可循的哈,包括呢,你看我们这个人为什么特别紧张焦虑的时候呢,就不自觉的会摸脖子呢。
10:01
是吧,啊,因为古代的时候呢,什么样场景下你会特别紧张焦虑呢,就是一堆动物现在看着你是吧?啊,或者一堆人呢,看着你,这时候感觉你要挂掉了啊,这时候你摸着脖子是因为很容易脖子很危险。啊,一口下去就断气了是吧?所以你要保护你的脖子是吧?这时候你的血液呢?为什么大脑一片空白呢?血液已经开始往四肢上开始去散了,脑子上就没血了是吧?啊对,哎,包括呢,这个大家也分享这个篮球啊,足球啊,哎,这有一本书叫叫为什么是足球,呃包括呃,当然主要说的足球啊,现在世界杯你发现的这个足球呢,应该算世界范围内啊。最受大家这个喜欢的一种运动了,因为在这种场景下呢,其实就像古代这种狩猎场一样,哈,呃,这个大家呢,去追着一个猎物来回跑,来回抢是吧?你可能觉得篮球也像,但是毕竟那个场地会小一些是吧?啊,然后呢,这个他只能用手那个足球的话呢,相对来说这个他的争抢度啊,激烈程度啊就会更高一些。
11:01
啊对,所以说这个足球呢,更容易被人们所接受啊,其实有好多人呢,现在这个习惯,咱们人类现代社会这才几百年,没没多久了啊,以前的时候呢,很多的习性呢,都保留着呢啊。好,这个我们再拉回来哈,呃,那么我们现在呢,就创建了一个man,创建了一个woman啊,然后的话呢,我们写具体的测试了。啊,看着啊,诶关于person的测试,好在这儿呢,我们去讲这个多态性的特点啊。哎,那么先说一下叫多态性之前的这种场景,什么场景呢?我们声明的是一个person,假设呢,就叫P。诶,我声明的是什么类型,我就knew什么类型。这是咱们一直以来的这样的一个想法。好,这呢是它啊,然后的话呢,也可能我声明的是一个慢,哎,我叫M1了,右边呢,我就拗了一个慢。哎,这儿呢,都不算是多肽啊,这是咱们觉得是非常天经地义的写法,声明是个慢,我就拗个慢,声明是什么我就拗一个什么好,什么叫多肽性呢?
12:07
啊,多态性呢,指的就是我声明的,明明是一个person。啊,但是我右边扭的时候呢,我却扭了一个慢。是这样的。就这样啊,你就想我们刚才举的生活中的例子啊,说呢,哎,我需要一个宠物。这假设就是那个宠物的类型,结果你牛了一个狗。啊,扭了个猫,那都算是吧,诶你看你想个宠物,我给了你个狗是吧?啊,我需要一个玩具,这个玩具啊,你牛了一个奥特曼。呃,的对象是吧?哎,这也算满足的说呢,我需要找个人跟我一起出差啊,顺便是个person啊,结果呢,秘书给你带了个男人去了。有点失望是吧,哎,但是呢,是满足你的要求的。哎,因为呢,你说的是这个类型,我这块也是类型啊,说你需要一个人注意这里边儿这人跟我们个慢呢,哎,不能说你随便来就行啊,这个慢呢,一定得是继承1PERSON。
13:03
啊,就像我们刚才说的,你整个小狗,这小狗得是个宠物,整个奥特曼,奥特曼它得是一个。玩具你别把真的奥特曼弄过来了,那也玩不了是吧,哎,对,你得是这个左边这个类型的一个子类的这个类型才行啊。哎,你说人是吧,来个人是吧,我需要跟着一起出差啊,来了一个男的,来了一个女的,都可以,因为都属属于人。哎,都满足我们的要求,所以这儿就是咱们Java当中的多态性。哎,有可能说是这啊,多态性这不也不难吗。格式上来讲是不难,关键就是说你说这有什么必要性呢。是吧,哎,拿就拿,带我为什么要用多彩星呢?哎,这个是难到这儿了啊,咱们呢,先别研究为什么用它,咱们先呢,哎,把它怎么用先说清楚,最后我们再说为什么要用它啊,OK,好,那么回过来。这块就提到了,说Java当中这个多态性的体现,怎么体现呢?哎,我们这里边儿呢,就这样来说的哈,说呢我们声明的。
14:01
是一个负类的类型。但是实际上我们扭的时候呢。是一个子类的对象。哎,那么这种情况呢,就称为呢,叫多态性,就相当于咱们刚才举的这个例子一样啊。哎,我这呢是一个person,哎这个P2了是吧?哎,New的是个慢,哎就以它为例,这就是我们Java中的独态性,诶我们怎么说呢,叫做负类的引用。指向子类的对象。或者的话呢,你也可以理解成呢。哎,就是反过来说吧,就是子类的对象。付给。负类的引用是吧。这里边儿这个引用呢,指的就是这个变量P2啊。哎,对象呢,这不就右边new的吗?哎,我们把这个的话呢,你可以诶写成是一个词,这个呢叫子类对象的多态性。啊,声明的是一个父类的,实际上你在拗这个具体的对象的时候呢,我们是拿的具体的子类的对象呢去拗的,那又因为呢,这个person类的话呢,它是不是有好多的子类啊。
15:03
啊,男人呐,女人呐,孩子呀,老人呐等等是吧,诶各种这样的子类,所以呢,我声明的是个person,实际上你有的时候呢,可能是他拿他的任何一个子类的对象呢,去负的值,这都叫做多态性。哎,就是我们的核心的这样的一个问题。啊,大家可能还是有疑问,说为什么要用它等等再说啊好,这个呢,我们说清楚这个多态性了,准确的说呢,就叫做此类对象的。不太行。好,那么有了它以后呢,接着我们来看一看啊,这个咱们就称为呢,叫多态性的一个应用了啊什么应用呢,比如我现在拿这个P2,咱们去调这个方法。在这个person里边呢,我们定义了it了,在这个男人类里边呢,我们重写了it了。问,我现在去调离it,表现出来的是哪个里边的方法?还着呢是吧,哎,包括呢,我们这个PP2.work呢也一样呢,重写了,哎走一下看看。
16:00
哎,你发现的话呢,确实是。诶,但是但是什么呢?你看我按住CTRL键啊。这边变成超链接了,我点一下。点到person里了是吧,Work点一下也是person。啊,那就相当于呢,是呃,这个点是什么意思啊,就是我们现在编译器啊,我点的时候相当于编译器认为是谁的。相当于呢,就是编译的时候呢,他认为我们现在调的呀。是你左边声明的这个类型的。哎,但是真正执行的时候呢,你发现。由于我们的呢,就是一个男人,所以呢,他表现出来了就是男人的这个特点。啊,吃东西呢就吃的比较多啊,走路呢就比较笔挺啊啊因为你实打实,你有的就是个男人嘛。就跟说呢,你现在找个人过来,我得找他办点事儿,哎,他可能来了一个男的,这个男人表现出来就比较有劲儿啊,说我想找一个,哎你呃,找个人过来办点事,抬一个东西,结果呢,给你叫来一个女生,女生表现出来就没啥劲儿。哎,但是呢,你说哎,我想找个人过来帮我抬点东西,实际上这块呢,就是你想调这个人的一个抬东西这样一个功能,但具体呢,是谁来抬呢,你得看来的是谁。
17:07
来的是谁,表现出来这个特点,那就不太一样了。哎,所以说这里边儿呢,我们称为呢,叫多态性的应用,这个应用的话,我们起个名叫,诶虚拟方法调用。啊,也称为呢,叫虚方法调用啊,虚呢就是那个Java虚拟机的那个区,就是virtual啊,Virtual method啊什么意思啊,具体来讲。嗯,这个咱们把它写成一个,比如多行注释吧。这样个情况啊,哎什么意思呢,就是你看我们在调用这个方法的时候啊,哎,调用方法时,哎,或者是这样讲啊在。啊,在多肽的这个场景下啊,我们说调用。哎,方法时啊,我们说呢,呃,编译时。哎,我们说认为啊,方法是啊这个。是不是左边声明的父类的类型啊。哎,左边,哎声明的。
18:02
啊,负类的类型。啊,那么在执行时。类型啊,在执行时。哎,实际呢。哎,执行的是哎子类啊,是不是重写哎父类的这个方法呀。啊,认为是声明的左边的附列的这个类型的呃方法啊,其实呢,即就是背呃重写的方法嘛。这个是吧。好,这是当你执行的时候呢,执行的是此类重写复类的方法。啊,那么把这种特点呢,我们就称为呢,叫做诶区域方法调用。虚方法你可以这样想啊,就是呃,你以为呢,你掉的是负类的,但真正执行的时候呢,你根本执行的不是这个是个虚的啊,真正执行的时候呢,是你此类的这个。那这叫区域方法调用。OK啊,就是我们说的这样的一个这种场景。啊,这样个场景啊,嗯,这个大家其实你要看一下的话呢,你看啊我这块儿,诶我这块也运行过了啊,那运行过呢,就意味着我们当前这个代码呢,已经是编译过了,编译过的话呢,我们来这个view这块看一下这个磁写码文件哈。
19:10
啊,在这有个方法,这叫密方法是吧,诶没法进来,我们看看它这个代码,哎,我们是不是调这个。哎,调这个it了是吧。是不是调离work了?那你看这时候呢,我们编译的时候呢,你看他是不是还认为我们调的是person里的。哎,这就我们刚才说的编译时呢,这个情况啊,然后你往左边放呢,你看这是不是叫in work。就是虚的意思是吧,就是调用我这个虚的这种啊,我们把这个就称为叫虚方法啊。嗯,简单的,你理解一下就行啊。好,这个呢,就是我们说的这样一个场景,对应的这个话呢,就是它啊,然后这句话呢,我们可以呢,简称为。那叫编译,看左边。运行。哎,看右边。诶很好理解啊,编译时看左边什么类型决定了你这块调的编译的是谁,运行时候呢,看你右边啊子类这个对象是谁,哎,我就调你重写以后的这个方法。
20:02
这儿呢,就看到是我们整个呢,呃,叫多态性的一个应用啊回过来。哎,它的应用呢,指的就是它。诶,我把这个往前拽一拽啊,那其实呢,关于多态性呢,核心的问题呢,就讲的差不多了。就是一个型叫子类对象多态性,一个应用场景,就是调方法的时候是这样子的。啊,那么基于这两点我们做个总结说呢,我们要想使用多态性的前提是什么呀?哎,首先哎,我们得有这样一个场景,这个场景里边涉及到了父类,涉及到了子类,所以呢,它的前提第一个。对,要有类的竞争关系是吧。诶,这呢也是我们讲的说,呃,你要是没有继承性的话呢,我们就也不会讲现在的多态性。哎,所以得先有继承关系啊好,那么有了继承关系以后呢,我们说,哎,光有这个呢,不是目的,目的的话,我们调方法的时候呢,你发现你真正执行的时候呢,是你子类重写的一个方法。所以这块我们一般会讲第二点啊,就是要有。哎,对方法的重写。
21:03
这就是我们说多态性的一个使用的前提。啊,这个就说清楚了啊好,那么整个关于多肽的话呢,其实就是核心的问题,就是刚才讲的这个事儿。但是大家呢,现在肯定又有疑问,说有啥用?是吧,哎,这呢也是大家最难的一个问题。好,那么在说清楚呢,这个多肽性有什么用之前啊,咱们接着呢,再把其他的一个小问题呢,我们再说一说,然后我们再给大家呢,去举这个例子啊,好,这块你看我又写了个叫多肽的一个适用性哈,什么意思呢?就是我们这个多肽性呢,到底在什么场景下能用这呢?我们要强调一下这个多肽的这种特点,我们刚才是叫虚方法调用,或者叫虚拟方法调用,它呢仅适用于方法。哎,不适用于属性啊,我这儿呢,先写出来啊。哎,适用于。哎,方法啊,明确要求。还不适用于。啊,适用于属性,哎,也就是这样的一个意思,大家你看啊,在这个person里边呢,假设我现在声明一个int型的ID,它的值呢,叫1001。
22:08
然后在这个慢里边呢,我们同样的声明一个属性。啊,Int类型的ID,我叫1002。好,然后回到我们这个,诶测试这个层面啊,比如说在这块了哈,哎,我们去测试这个诶属性是否满足多态性。哎,那我们这儿呢,不是有这个P2了吗?我就直接点ID了啊。点ID以后呢,我直接呢去打印。那现在的问题呢,就是说,呃,此时这个ID到底打的是1001还是1002。啊,这块的话呢,我们可能推论的话就推不出来了,是吧,咱们看下这个结果啊,这个结果呢,你发现呢,它是1001。哎,1002呢,说白了就是人家傅雷里边声明的是吧。哎,那么为什么是负类声明的呢?因为呢,你声明的就是person。这块呢,我编译的时候看的是左边,运行的时候呢,我看的也是左边是吧。
23:01
跟右边这个慢呢,没啥关系啊。啊,或者换句话说呢,就是哎,我们此时的这个P2啊,咱们真正逆完以后的这个对象呢,在堆空间其实就是一个男人。但是那个男人里边呢,是不是有俩属性?一个是来自于你父类的ID,一个是你自己的这个ID啊,这个还有其他属性啊,咱们就忽略了啊,一个ID呢,来自于父类,一个来自于你子类,父类这个呢叫1001,此类这个呢叫1002,然后呢,我打印的是谁呢,就只看你这个变量的类型。那是person,好,那我就打这个。啊,那从这个角度上来讲呢,我们说属性呢,是否满足多态性呢?哎,就是所谓的边一看左边因看右边呢没有。啊,这个呢就不满足啊。换句话说,咱们现在讲这个多态性的应用啊,咱们就只看的是方法,根本就不管这种属性的事儿。本身呢,咱们属性呢,也不建议大家你在此分列当中去定义这种同名的哈,所以根本呢,我们也不去聊这个问题。啊,这呢,就是咱们小所要讲的这个叫呃,适用性的这个问题啊。
24:03
啊,就是他。好这呢,我就说清楚了啊,好,这个说清楚以后呢,咱们下边呢,给大家去讲一下啊,刚才提到说这多肽这个。嗯,东西呢,倒是大概明白,但是这有什么好处呢?乃至于说呢,有什么弊端呢,是吧,哎,咱们给大家讲一个应用,这个应用的话呢,大家体会一下,哎,我们说多肽的一个好处。相较于继承来讲呢,继承大家可能非常的清晰哈,一继承功能立马就扩展了,那多肽呢,这块的一个好处在哪呢?希望咱们需要咱们呢细微的去体会体会啊,现在呢,我给大家举一个例子,这个例子呢就体现它的一个好处了。这块呢,哎,我声明叫class叫animal。啊,举另外的一个啊,一组例子啊,这这个叫动物了,既然呢跟多态性跟属性也没啥关系,我这块直接就上方法了啊。这个animal的话呢,Would啊,比如来一个it。
25:00
哎,我们就发展在一起啊,说叫动物进食啊。好,然后呢,Public word,再来一个,比如叫jump。哎,这个我们叫哎动物,哎跳吧。行,这呢我就写两个方法,然后接下来的话呢,我们再去来声明关于这个animal的两个子类哈。比如dog啊,Extend这个animal。哎,多肽的话不是涉及到有方法的重启吗。然后把这个重写一下啊。啊,这个呢,叫。狗吃。吃点吃点骨头吧啊。吃点骨头啊,帐篷。嗯,比如说狗急,诶跳墙是吧。好啦。为啥那么开心呢?嗯,好,然后呢,把它哎整过来。好,然后这块我们来一个cat啊猫。哎,猫吃。
26:00
猫吃猫粮啊。猫吃鱼吧,嗯。这个是吧,好,然后呢,这个就是。猫几条虾,嗯,猫。笑吧。或者叫学猫跳啊,它本来就是猫是吧,那就是猫吧,嗯。嗯,就就就跳吧,就这样啊好,这个呢,就是我们写的这个猫,哎,这个是狗啊,哎行,这个就写完了啊好写完以后的话呢,你看这就构成了一个有继承关系了,一个方法重写了好多肽呢,都已经给你备好了,然后呢,我们在平时开发当中啊,诶我可能会写这样的这个逻辑了啊,比如public avoid说现在我们有一个方法啊,这个比如说叫一个。呃,我就要一个。放吧,啊就它啊,然后这个参数的话呢,就是animal。啊。或者你觉得放你觉得不好理解,比如说我们叫adopt。领养饲养是吧,饲养一个宠物啊,这个宠物呢,是一个动物是吧?好,那这样呢,我想领养啊一个动物啊,这个动物里边呢,我就去钓它的相关的方法了,你看这是我们再去调的时候呢,你就能理解,只能调animal里边有的这个方法。
27:13
你说我想钓,哎,这里边动物所特狗所特有的,比如我们这块给狗来一个啊,你想想这个能不能掉了。A public avoid啊,狗的这个特点呢,就可以可以看家是吧?看家怎么写?啊。嗯,看家就是watch是吗?这个真是简单明了啊。嗯。其实有好多这个,呃,英文里边啊,其实英文这个语言呢,它的特点呢,就是它可以随着人的习惯不断的在变,是吧,其实有好多这个英文的翻译呢,也受到中文的影响。啊,比如说什么呀。啊,好好学习,天天向上是吧。这个不是那样说的哈,Good good study day up是哈,当然这个大家说多以后呢,也可能老外也就懂了是吧。
28:01
比如说给你点颜色看看是吧。啊,对,Give you some color to CC是吧?啊,你说以后呢,老外可能也就知道是这个意思是吧。啊,你就watch道看怪怪的,反正是啊或者这个。就这样吧,是吧。这个呢,哎,狗能看家是吧。好,这个猫猫咱们也整个方法。啊,这个比如说抓老鼠吧。嗯,这个现在呢,好像不太能了是吧。嗯,猫抓老鼠是吧?对,现在见着老鼠之后它都怕啊。行,这个呢,你看是这里边儿特有的方法,你说我们在这个animal这块,你能贸然的去调一个看家呀,或者抓老鼠这个事儿吗。不能是吧,因为你也不知道这是什么动物啊,所以现在我们能调呢,只能是你I里边声明过的这个方法。哎,行,这就完事了啊,然后呢,我们在具体的这种啊,比如说某一个方法的场景下呢,我们想调用这个方法了,哎,那目前呢,要想调我们得造个对象了啊。
29:03
哎,这样好,那么通过这个T点我们去调这个adopt这个方法的时候,诶大家想啊,现在呢,我们如果没有多态性的话。假设你现在想领养一个东西。那像这样一个小动物,嗯,你如果没有多态性,由于声明的是animal,你这块只能是new一个animal。其实你都不知道你养了个啥?是吧?哎,就只能是这样了,如果没有多态性,你说我就想营养一个狗,那不好意思,你自己呢,再去声明一个参数是狗的。哎,真的生病成狗了,然后狗呢,再去哎调这个它的比如些方法,因为我我不想养狗,我想养猫是吧,有人喜欢养猫行,那不好意思,没有多态性,那你自己呢,再去调个造一个方法,这里边呢参数呢是猫。哎,然后这块你再调这个猫的这个功能。啊,那以及的话呢,我们还有很多未知的,不知道你到底想领养什么,那就会导致这里边儿这个方法呀,是不是就相当多重载的了。
30:03
啊,对的好了,哎,那你只能是这样处理,因为没有多态性嘛,好,那现在呢,如果说有多态性可以去使用了,我说呀,下边的这一系列的这种方法呢,我们就都不用去写了。对吧,就不用写了,哎,你只需要呢,生明一个这个方法就行,因为呢,这里边儿我们就可以去new一个dog了。哎,一个dog,哎,那么从形式上来看,我把new的这个对象,这是个匿名对象啊,我就付给了你这个animal了。所以从这来看的话呢,我们不就是声明的是一个animal,但你实际上呢,哎,这边不是就new的一个dog吗。哎,这不就构成了我们多肽这样一个型了吗?负类的引用指向子类的对象。哎,真的就出现堕态了,好,那我在执行的时候呢,你编译的时候啊,编译时候你看上面还不知道这个事儿啊,我们在创建这个类的时候呢。我这个时候呢,说就是调这个animal的这个it和jump了,咱们刚才也说了哈,你只能调animal里边有的方法。
31:01
所以呢,这块我们编译的时候呢,你看按住CTRL键,我一点就点按这了啊,这个我也一点也是点到这了,但是真正当你执行的时候呢,你传进来是个狗。所以呢,你在执行的时候呢,我们一运行。是不是就是狗表现出来这个吃和跳的功能。哎,这不就是编译的时候呢,你看的是左边啊,哎,真正运营的时候呢,你传的是个狗,所以呢,表现出来就是运行看右边了。诶,这就是我们实际的这种场景,好这个不满意是吧,你说我们这想养的是个猫,哎,你把这块改成猫就完了嘛,用的还是这个同一个方法。哎,还是呢,以多态的方式呢去呈现的,然后编译时候还是左边,运时候还是右边,哎,这时候呢,就是猫的这个吃和它的这个跳了。这儿就是咱们多肽真正使用的这种场景。哎,大家体会一下啊,哎,那么回过来,那你说这个多态性啊,我这先写的弊端啊,那你说有什么好处呢。诶,是不是我们可以极大的减少代码的冗余了是吧?诶,不需要去定义非常多重载的方法了。
32:03
这个哎,这个叫哎极大的。哎,减少了啊,代码的冗余。是吧,哎不需要啊去定义,哎这个多个。哎,重载的这种方法。呃,其实这个事儿的话呢,不光是简单的话,我们这块呢,去少定义类两个方法,在我们实际开发当中哈,这个位置很多时候呢,我们呃只能是写一个父类的,因为你具体有什么此类呢,我都不确定。你后边还有哪些词类的?啊,你举个例子啊,比如说咱们也举过这个手机上的这个界面了啊,有各种各样的这种啊,呃,这个I test就可编辑的啊,Test view就不能编辑的这种文本啊按钮啊呃,一个视图啊,就一个图片这样的,他们其实都是view啊。都是视图是吧,然后这个view的话呢,只要你是个view,我就可以考虑呢,给你比如说设置一个绑定的事件。就是你点击一下就好使是吧,哎,那其实呢,我们在一些操作的时候呢,一个方法里边我的一个参数啊,我就写成view了。
33:08
我就写成view了,然后里边呢,我就拿这个view呢,我去做个操作,只要你这个view,我们就有相关的一些功能,我就这样写的,但你实际情况的话呢,你可能操作的是一个按钮。可能是一个这个图片这样的一个image view啊,哎,也可能是一个,呃,可编辑的一个test,哎,那你这块往这传的时候呢,里边就都执行就行,那除了这个之外,你说你这就四个啊,那我就不是省了四个方法吗?其实不止如此,你们,哎我们是吧,我们还可以再去自定义视图。那你想定义什么都行,只要呢,你定义的这个视图啊,首先你继承你这个view,这就算自定义了,只要你自定义了原来这个方法,你看是不是还可以用。你只要是自印了,你这边就是我的子类,你就可以造你的对象往我这放。哎,所以这块呢,呃,相当于呢,就是对于未知的一些操作呢,我们相当于这个方法仍然可以去使用。啊,这个呢,其实在编程设计上呢,它有一种思想呢,叫开辟原则啊。
34:02
那这个开辟原则呢,我们看一下这个课件里边。我这里边儿写了啊。关于它的这个好处和弊端这块。哎,你看这儿写的啊,正态使用父类呢,作为方法的型参是多肽使用最多的场合,即使增加了新的子类,方法呢,也无需改变,提高了扩展性,符合开辟原则。什么叫开辟原则?对扩展开放,对修改关闭。啊,这个开呢,就是open close的principle啊,这个原则是什么意思,通俗讲啊,我们在这些场景当中呢,在不修改原有代码的基础上呢,引入新的功能了。就像我刚才说的,你这个行参呢,这写的是个view。啊,然后呢,你里边呢,就是调view的功能的,哎,那实际开发当中呢,你可能随时的去自定义的一些组件,然后呢,我也能够去用,所以呢,在不改变原有的这个控件使用的情况下呢,我又开发了一些新的功能。啊对扩展呢是开放的啊对修改关闭呢,就是这块,我们这这呢,只是一个一个扩展的功能啊修改我们没有呢,去修改了是吧。
35:02
哎,这个呢,就注意稍微的体会一下这样的一个原则啊。好,那这呢就提到了我们这个多态性的一个好处的问题了。来举例呢,就是见我们这个下边,比如说举的这样一个例子了。啊,一会我们还可以啊,就现在吧,啊,还可以再举个例子啊,你比如说呃,咱们前面呢讲过这个叫所谓的账户是吧。呃,这个账户呢,它就相当于是比较抽象的一个负类的了啊,那具体在实际大家去银行的时候呢,你可能去呃,办的是这种信用卡。哎,叫check count,哎,我们让他俩去继承语。哎,这个account了,哎这呢是一种卡,那其实呢,在银行里边呢,那卡很多是吧,给我们来个这个储蓄卡吧。哎,Saving account。这呢,这这太多了,包括那里边儿具体方法呢,是不是可能会存在重写是吧。哎,存在啊,方法的这种。哎,重写的情况啊,好,下边呢,也一样的道理。诶这不就构成了我们整个这个继承的,呃,多肽的这个两个大前提啊,第一个呢,得有继承性,第二呢,有方法再重启,好现在呢,诶你作为一个客户。
36:09
Customer。哎,然后呢,你又有个属性,这个属性呢,就叫做account。诶,然后呢,我们通过这个public叫set account这样一个方法,给你这个属性的赋值。哎,这么着是吧。哎,这个呢,我们就AC4点啊account。哎,等于这个account就它了啊好,那么把这个场景呢,我们就营造好了,下边呢,就具体的咱们来一个叫哎测试的这样一个情况啊。这里我就简写了啊,这个没方法。好,没法进来以后,首先啊,我们去创建一个customer。哎,好,哎,卡斯特啊,少个O啊。好,创建完以后的话呢,接着哎,我是不是想绑定一张卡呀。那这是我想set一个count。
37:01
哎,你想绑一张卡这块你就会说明我想绑一个,呃,信用卡呀,还是个储蓄卡呀,这就是特别具体的了。比如说这块呢,我就想绑定一个信用卡。啊,那这时候呢,实际上你在这块赋值的时候呢,我们就扭了一个。哎,是不是叫check count。哎,就这样了,好,那么你现在呢,就把new的这个对象是不是就付给了这样的一个变量了。哎,这是不是就是多肽了。没问题是吧,哎,这不就多大的场景好,然后你有了这个卡之后呢,接下来你通过这个卡点,我那叫get account拿到你这个账号了,然后呢,我去withdraw。是不是就取钱了?哎,那这个曲线的功能呢,哎,我说呀,肯定你得在这个account里边,你得声明。Avoid啊,叫with。哎,照是吧,哎,真的就是你取钱的这个方法了。诶去签是吧,但是对于我们这个信用卡来讲呢,我是不是对这个方法呢,就会重写呀。
38:03
哎,就重写了好,那么呃,你这个get count呢,获取到的是一个,呃,对应的这块,你得有这个get方法啊。Public。Account。哎,其实不自觉的,我这块又写了一个案例了啊。哎,回过来还是填一个这个你的这个account了,好,我这块呢,返回的就是一个account,所以这块编译器看到就是一个账户。所以呢,你这块调的方法呢,也只能是调你账户里边有的方法。就他但是真正运行的时候呢,诶我发现呢,你其实当初是拿这个信用卡的这个对象赋的值,那就表现为就是信用卡的特点了,所以你再去真正取钱的时候呢,呃,就是你掉的你自己重启的这个方法。啊,你像这种场景的这太常见了啊,哎,这块呢,你只需要传个账户就行,具体是什么账户,我们其实都是子类的对象。大家去银行办卡的时候,你肯定办的都是具体的卡,你不会说很抽象这种卡。诶,所以这块呢,其实诶多态的场景大量出现。
39:03
甚至呢,我们夸张点说哈,如果要是没有多带性的话呢,Java这个代码呢,基本上就寸步难行啊。你想说我们现在要有一张卡,你只能是整个他的卡,那你想如果要储蓄卡没有,还得重新造个这个方法。那这个代码呢,随时呢,会有各种卡片增加,那你这块随时得去改代码,那就费死劲了。啊,所以多态性呢,实际上呢,使用是极其广泛的啊。好,那说了这么多呢,这都算是好处了,那么大家想想多肽有没有弊端?诶挺好的哈,哎,这就提到了一个弊端的问题,确实如此啊,什么问题呢,你看啊,回到我们这个person的这个层面,咱们呢,诶明明拗的是一个慢。哎,那这块我们的问题是在内存空间当中是否加载了慢自己特有的属性和方法。比如说这个慢里边的这个挣钱的这个功能,你说我们包括这个它自己特有的这种属性是吧,内存中有吗。
40:06
还是说没有的。有你有他了,你能没有吗?是吧,只要你有的话呢,你自己这个类里边有的功能,还有你负类的不都有吗。所以实际上是有的是吧。啊,这个大家要认为没有的话呢,咱们下边就没法讲了。是吧,也真实也有啊,这个呢,咱们说一下这个叫哎多肽的这个叫弊端了哈。哎,这个弊端是什么呢?首先我们问了一个问题哈。哎,这个问题问题是什么呢?就是我们通过这样的一个操作啊,诶诶这个操作啊。哎,这个操作好,那我问题呢,就是说诶内存中是否啊这个针对于这个。这个对象是吧。针对于。哎,咱们创建的。啊,这个对象在内存中。哎,是否加载了,说这个慢类中。
41:03
哎,声明的。哎,特有的这个属性和方法。下载了吗?哎,这个注意是加载了。那接下来呢,第二个问题,那能不能调呢。是吧,哎,能不能。哎,能不能,哎直接调用啊,咱们这个诶慢类中。嗯,加载的这个,诶,特有的这个属性和方法呢。哎,这个呢,我们说呢,就是不好意思,不能。是吧,哎,是不可以的啊,所以这块的话呢,我们相当于可以看成是多肽的一个弊端了啊。那没有办法,那就是不能。嗯,但是呢,大家你要注意一下,就是呃,咱们多肽要使用的话呢,其实主要用的呢,应该是在这种行参的这种场景下。你想在这块要是调到啊,这个你可能会觉得呢,更好理解一点啊,比如我这animal animal这块,你想调这个狗啊看家的这个方法。
42:02
想想你都觉得呢,不太能接受。啊,因为呢,你在这个位置看的时候呢,你哪能看出来这是狗呢。是吧,你咋看出来的呢?是吧,完全看不出来,所以这块呢不能调呢,呃,其实呢,也是合情合理的啊。那属性也一样啊,你要道德里边有个属性,你在这看,你哪知道这是狗。所以这块不能调呢,其实是比较好理解的啊,只不过呢,大家可能在这块理解的时候觉得有点不太能接受啊,说你看你这就扭的是个慢是吧。你这块生命的是个person,你凭啥不让我掉呢?哎,其实咱们说呀,在方法里面这种我们是方法内的这种局部变量啊,这种写法呢,确实是多态。但是呢,这种写法呢,还真是平时没什么必要这样写。你说我这块,我我就这么着。我就慢一下,我叫M2是吧,我就又一个慢了。你说我这样写法跟你上边这个写法相比。
43:01
我说呀,这个写法只有好处。没有缺点。啊,我用的是个慢,这都一样啊。我生命的是个嘛。我慢里边的方法我能调你,负类方法全允许,我也能调你呢。只能掉你负类的,自己有的还调不了是吧,那你说这是多肽啊,多肽在方法里边来看,这没有任何的价值啊。哎,要方法里边定义的话,那我们就这样定义多爽是吧,哎,实际上呢,主要的多态应用场景呢,是这儿哈,因为这个时候你根本不确定你传的是什么。所以我们才会用多肽的。啊,这个大家注意一下啊。所以为什么大家呃比较难理解呢?因为呃可能你看到好多场景讲这个知识点的时候呢,呃一开始都是呃拿这个方法里边去讲的,那确实是有点懵是吧,我干嘛不生成成一个生命成个慢呢,那多好啊,是吧,也确实如此啊。好,那咱们这块呢,也确实看一下啊,你拿着这个P2呢,咱们去调这个玛尼。啊,这个显然呢是不靠谱儿的啊。哎,这个呢,就调不了是吧,哎包括呢,你拿着这个P2呢,我们去调,诶你这个慢里边,哎特有的这样一个属性。
44:06
哎,这个呢,也掉不了。哎,我们打印一下就不让我打印了啊。这个。自己加一个吧。你这么着诶。P2啊。哎,这么着啊,这个呢,我们发现呢是不允许的。哎,就不能掉。好,这个呢,我们注意一下这个场景,这呢就理解成是我们这个一个弊端了,呃这个弊端呢,我们怎么去说呢,呃就是呃在呃多态的这个场景下。哎,多肽这个,哎场景啊。下,哎,说我们创建了。啊,这个诶子类的对象啊也哎加载了子类,哎特有的这个属性和方法。呃,属性啊和这个方法啊,但是呢,呃,由于声明为。
45:01
诶,负类的这个引用。啊,你生命成一个负类的类型了啊,哎,导致呢,我们没有办法。啊,没有办法啊,直接调用。在此类特有的。这个属性和方法啊,这呢我们就看作是一个弊端了。OK啊,这就这样行,那么关于这个好处弊端呢,我们也就说清楚了。
我来说两句