00:00
多态性的话呢,核心的点就这两个,那大家现在的疑问就在于,我们为什么要讲这种多态性,为什么要有多态性。这也是我们为什么说多态性难理解的一个原因。一说到封装性,封装性的话呢,啊,有个类,然后有几种权限,还咔咔把这几个类的这个内部结构呢,用这种权限修饰一下,相当于呢,咱们把这个代码呢,都给它模块化了,然后体现这种每个模块的一个可见性的大小,比较形象,说继承,继承也很形象,这有个类,这个类一继承,这个功能立马就丰富起来了,说呢,提高了代码的复用性,还更好的去拓展等等。这两个都很形象,那这个多态性呢,确实是有点儿抽象,就是让你一下子好像感受不到,说为什么要这样去设计,而事实上呢,这个多态性用的非常广,没有多态性的话呢,后续的像我们说的抽象类啊,接口啊,他们就都没有意义了。现在你可能没有这个概念,那咱们下边呢,举一个多态性的一个例子,通过这个例子呢,大家体会一下,咱们确实呢,还是要有这个多态性的这个例子,我就举一个这个动物相关的,所以咱们每天写的例子,不是人就是动物要形象一点,大家去理解这个呢,咱们是叫多态性的使用。
01:26
啊,举例这样个情况啊,举例一好,那这块的话呢,我们这样子做啊,我这呢先声明一个class,这呢我叫一个animal。这叫一个animal行,这个animal是个动物,这个动物的话呢,我们去提供它两个方法,叫public avoid,先是一个吃东西。对,这个动物叫进食,然后public boy再来一个叫这个。
02:11
这现在你也不知道是啥动物,就只能先写个叫了,好,这呢是一个父类,接下来呢,我去提供这个子类,这我写个dog extend animal。继承以后这两个方法呢,它就自然的就继承过来了,那我这块呢,对这个方法进行个重写,但多肽的前提呢,就是一个有利的继承性,一个呢要重写,那么对于狗狗呢,吃骨头狗吃狗粮,现在狗好多狗粮比那个人吃的还有营养是吧,这个这个shot,那就是哎汪汪汪这样。好,然后再整一个猫,嗯,Control下看,嗯猫呢,猫现在都怕老鼠啊,猫猫吃鱼吧,猫吃鱼,然后猫喵喵喵这个去年剧火的这个歌是吧。
03:16
那行这呢,我们就把这两个子类呢,就造好了,造好以后的话呢,我在这个测试类里边啊,我这写个方法说public VO我写一个啊function function就是一个函数,一个功能这样一个方法,这个方法的行参呢,我写的是个animal。然后呢,我这既然是个animal了,Animal就具有it和short的功能,那我这里边呢,我去调animal.it animal第二我第二个它的shot。这样,那我这呢,这不就调它的这两个功能了啊,然后呢,咱们这写一个main方法。这个没方法,没方法这块我们呢想调这个方法,那你此时呢,需要创建它所在类的对象。
04:08
CTRLV一下,然后我们调这个test,咱们调这个叫诶放这个方法,调这个方法的时候呢,这时候大家看我们首先需要传一个实例了,这个实例呢,就是付给你animal这个声明了,我在这里边对刚才有同学提到了,我就new一个dog。我把new的这个dog,这是用的匿名对象付给了咱们这个animal的这个声明,那我们执行一下大家看。这重要是不是应该就是狗所特有的这个方法了,对,就是这样个情况了,那从这个位置来看,相当于咱们声明的是一个animal。然后呢,但是实际上呢,你是不是给你了一个dog呀。这不就是多肽的这个子类对象的,呃,对象的多态性的这样的一个形式吗?然后呢,当我们在里边调功能的时候,因为呢,咱们声明的是animal类型的,所以我只能够调animal这样的这个方法。
05:06
但是呢,你实际上你用的是个do,那我真正运行的时候呢,发现呢,就是这个do重写负类的这个方法来执行,这呢就都是重写的。那类似的话呢,我们这儿呢,在test点这个放,我还可以去new一个cat。哎,New cat,那自然而然的这个就是cat里边运行的这个它自己所特有的方法了。诶这呢,就是咱们说多肽的一个使用,可能你这块还差点意思,差点意思是因为你这时候我还给你少写俩方法,你想想如果要是没有多肽性的话。没有多态性,那就是不是意味着我要是调这个方法,只能是去new一个animal?只能用个animal,用不了别的,因为你没有多态性啊,那就意味着呢,我这儿呢,你看我就简单的只放了两个子类,那就相当于呢,你这里边儿还得去写另外的两个方法,我这呢写一个叫do,这些一个do,这就是如果没有多态性的话呢,那你只能是这么着了,然后猫猫你也想用,那你只能是再去造一个重载的方法。
06:20
这里边呢,我就cut点一,然后cut点这个short,想想如果要是没有多态性,是不是我们只能这样子去写了。那你声明什么类型?只能是你有这个类型的对象,这叫不用多态性,凡是你只要是他此类对象,那就是多态性。啊,那我们相当于这个多大性有什么好处,是从这样角度来说的,就是说有这个东西跟没有这个东西的区别是什么?那进进而呢,就相当于解释清楚它到底有什么好处了啊到底有什么好处,就跟说比如说这个啊,有个女朋友跟没有女朋友的这个区别是什么呢?你发现你生活没有任何变化,那就没有得了是吧?啊,那就是没有什么好处啊,但是呢,你要有了女朋友以后,你发现呢,对钱有花的这个出处了是吧?啊不用为这个挣的钱花不出去而担心了啊,你就有好处啊,这就是说这个他有女朋友的一个好处什么这呢,就是你要没有多大性呢,你就意味着我们呢,是不是会去造很多重载的这种方法了,咱这呢,只是写了两个子类。
07:32
那你想象一下,这其实我们再写呢,可以理解成第二个这个举例了,在第二个举例,第二举例呢,我这就诶这个诶随便的我写一个方法了啊,比较class我就写成个order了,比如说大家看啊,我这里边呢,我写一个普通的一个方法,我这就写成一个叫method了,我这个方法的行参呢,我是一个object类型的。具体这个形态我就呃方法体我就不多写了,你想想我这写的是个我不占类型的,你说我这个方法这个通用性有多肽的话啊。
08:06
是不是这个通用性挺好的,那就意味着呢,我们只要看到一个行参是object了,你是不是随便扔一个对象都行,它都通用,你要是没有多带性,那就崩溃了。那就意味着这个位置你只能用一个object,你你想放别的,你想放谁,你就得有那个对应的方法,那就相当于咱们再回过来说这个事就是有了多态性以后,我们呢,就省去了这么多这个重载方法的一个设计了。这呢就体现了它的一个应用,我们凡是看到你声命的一个类型,我呢可以给你去啊,此类的对象去复制啊,这呢就是多态性的一个应用场景啊,那么类似的呢,咱们上午也看过这个object类啊,大家看object这个类里边呢,像这个E的方法是咱们用的非常频繁的一个方法。这个E的方法呢,它的行参就是object类型的,那就意味着我们呢,其实在这个位置放的时候都是放的此类的对象,一般咱们很少说我去new object没啥意义啊,Object作为一个跟赋类,它没有什么明显的特征了。
09:14
他都得是用它的子类去放了,所以这块我们都是放的子类对象了,你要是没有多态性,那就崩溃了,那E4那你写吧,写不完,你放了一个A类型,那这个A的子类又放不了,那你再放A的子类,那还有B类C类没完没了了。哎,这样呢,大家去体会一下这个事儿啊,还可以呢,我们再举一个小的例子。再举个例子,这个例子的话呢,我这写的就不是这个特别的规范了啊,但是大家呢,就先这样体会一下,给大家换了一种形式,咱们后边呢,讲完这个Java基础以后,后边咱们还会讲这个MYMYQ呢是这个叫数据库,哎,这个数据库呢,MYSQL只是其中一个,还有这个像orac,对,像这个DB two,还有这个搜server。
10:04
Circlel server等等,这有很多种数据库,然后咱们呢,是想用Java程序呢,去连接并操作这里边儿数据库中的数据,我想往这个数据库中填山改查一些数据,那要想实行执行天然改查,首先呢,你得先获取这个数据库的连接。我得先给他能够搭上连接,然后我才能够去操作,就跟说你想认识那个女生,你得先拿到她的微信给人能聊起来是吧,先建立连接,才有后边的各种可能性啊,这呢也是一样,那么此时的话呢,我们就可以比如我这就写个方法啊,Public word,我这叫get一个connection,这里边哎,我这个代码不是那么规范啊,但是为了让大家更好的去理解,我就先这样的去写了一下,哎,或者这块,呃,这块不能这样写了啊,这个我们就想去处理数据啊,Do data吧。这个connection他这还真得让我导一个导一下吧,这个connection的话呢,我呢就可以写成一个负类的一个类型的。
11:09
大家也看到,你看我这时候导过来的这个connection呢,是不是咱们Java提供的一个API啊,这是va定义的,按说的话呢,My Oracle等等其他的数据库,这跟Java其实是不同的厂商了,我们只是用Java程序去操作那些不同的厂商人家的那个产品了,所以这块呢,咱们实际上放的是相当于是一个负类的结构,只不过只不过呢,这个时候它其实本质上不是一个负类啊,是一个接口了啊,大家现在你可以把它就当做是一个负类的了,当我们真正调这个方法的时候呢,我实际传的呢,都是一些具体的子类的对象了。比如说我真正啊这个con是吧,我真正去new的时候呢,我new一个叫my circle的一个connection,那相当于我们这时候呢,建立的就是MYSQL的一个连接。因为有了连接以后,我们后续这个具体的操作的话呢,这个大家都是比较规范的,规范的这个步骤啊,去操作这个数据,这个什么叫规范的步骤,操作数据呢,就是这个Java呢,就是怕大家呢,就是不同的数据库之间操作起来太复杂,让咱们成员呢,说说咱们操作MY,操作Oracle,操作DB two,咱们呢想进行比如添加操作,咱步骤呢就三步,这个是JAVA9规定好的。
12:25
那不同的数据库厂商得符合这个Java这样的一个规范啊,那么我们这里边写的这个步骤呢,其实就是固定的,比如我们拿着这个它啊,先做第一个事儿,比如说调这个方法好做了个这个事儿,然后接着呢调第二个方法。这个我就都抽象化了啊,然后再调一下这个第三个方法。我把这三个方法一调,那相当于呢,我们整个这个整个这个添加数据的这个操作呢,我就完成了,这就相当于在咱们这个副类当中呢,我就定义了三个步骤,那么真正你去操作的时候呢,我们你这个连接,它就没有说你Java这个整个连接了没有了,那就得是你可能new的呢,是一个MYSQL的一个连接,那么new个MYSQL连接new完以后,那这呢,首先它这个多态的形式了,然后当咱们去调这三个方法的时候,那你想想这三个方法是不是就具体是你MYSQL里边重写的方法,因为这时候你你真正是在MYSQL当中,你去填一个数据,你想怎么做,那重写的方法,也就是说我们这个子类呢,它一定得去重写了,那也有可能呢,我这时候knew的不是它了,哎,我呢这个con,我new的呢,是一个,比如说叫Oracle的。
13:42
啊,一个。那我们new的是个它,那这时候呢,就意味着我们建立了一个跟my circlele,呃,跟Oracle的一个连接,那接下来呢,Oracle对应里边呢,也重启了这三个方法,那我们下边这个代码你都不用改,只要你调离方法里边呢,你传哪个对象,我就建立跟哪个数据库的连接,里边呢,因为人家也都重写过了,我自然而然的就能够,诶实现对那个数据库中表的一个操作了。
14:13
哎,这呢,这不都是多态性的体现吗?你也可以想象一下,如果要是没有这个多态性的体现,那就意味着你要想操作,对于Java来讲啊,你想操作myle,写一个MY的方法,操作Oracle,写个Oracle的操作,其他的写个其他的这块就得写很多的方法。显然呢,是比较繁琐的,哎,所以通过刚才举的这三个例子,大家呢,去体会一下我们为什么要有多态性这样一个点。啊。
我来说两句