00:00
行,那接着的话呢,咱们复习一下打开E。咱们复习一下昨天讲的这个内容,我们昨天呢,把面向对象中这里边的内容啊就都讲完了,我们呢是从这个多态性这块一直呢讲的这个末尾行这样的一个情况,那我们就来复习一下昨天讲的这个内容,昨天呢其实讲的这个细节呢,还是比较多的,那我们实际呢,就是讲新课的时候呢,先要把这个知识呢先变厚,里边呢有好多的细节啊,一些小问题啊,这个咱们都尽可能的都提到,然后呢,等复习的时候呢,咱们再抽取出来这里边最重要的这个内容,以及开发当中我们最常用的一些东西,所以呢,就把这个内容呢在变薄,这个变的过程当中,大家过程中,我前天听课我就我就稀里糊涂听得了,然后第二天我就复习,把这复习了半个多小时的这个东西好好看看,那你可能也会遗漏一些东西。就是这个,当你这个细致的整完以后呢,这个复习的时候,这个内容其实呢,就是你要是之前看的比较清楚了,这个复习呢,你会比较轻松,但是你要是之前呢,没有好好的去看那个细的东西,硬抽出来这个粗的东西呢,有的时候有些细节你也不太好理解。
01:09
所以呢,得先有前面这个过程,前面这个过程呢,也是必不可少的,行,我们先来说这个多态性,多态性是我面向对象的三个特征的第三个。第三个在这里边呢,最后我也放了一个这样的问题,说你是如何对多肽性来理解的,实际上呢,现在咱们写这个问题呢,还不是理解的特别透彻,因为有一些东西呢,我们靠后的还没有讲,讲了以后呢,再去理解这个多态性呢,会更好一些,但是呢,毕竟我们讲完了,所以在这呢,也简单的先说一说你是怎么理解多态性的。面向对象的三个特征当中,主宰性呢,也确实是最难描述的一个。容易,说不清楚也容易呢,看出来你这个掌握的不是很透彻,前面的封装性和继承性相对来讲是比较好描述的。啊,比较好描述的,当我们整个讲完面向对象以后,咱们把说你是如何理解面向对象思想的这个事儿呢,咱们系统的再说一下这个问题,现在呢,先简单的说一下这个具体的这个多态性啊,一会儿复习到这的时候呢,我们再说在多态性这块的话呢,我们其实是分成两块内容来讲的,最简单话来描述呢,就是一个叫向上转型,一个叫向下转型的事儿。
02:24
向上转型呢,就是我们所谓的多态性,就是我们之前呢,讲的一直到这个第六个点,这就算说完了,那我们接下来呢,或者昨天呢,我们讲的时候呢,一上来就开始说叫向下转型的问题。首先我们明确一下,向下转型,就是我们说把一个负类的引用呢,转成一个子类的一个声明了。那那对应的这个销量转型,就是我们所谓的多肽,这叫多肽,那向下转型。那这个就是我们下边要具体说的这些事了,首先我们为什么要使用向下转型,那会儿其实也说这个问题了,这个我们都写到这了,主要原因呢,就是因为咱们想用此类的这个属性或方法了,你生命成负类的,我也用不了,必须要用,必须要用,那就只能是线下转型,所以呢,这就我们写的这样的这个话。
03:17
把这个呢粘过来。见了有就没有了,有了对象的多态性以后,内存中实际上是加载了此类特有的属性和方法的,实际上是加载了这个属性和方法的,但是由于变量生命为负类类型导致呢,在编译的时候,我们呢,只能够调用父类中生命的属性和方法,此类特有的属性和方法呢,不能调用,那如何才能调呢?那我们就需要呢使用相碍转型。使用向下转型,然后这块的话,我们CTRLX这个拿走,那么如何实现向下转型,就是使用强制类型转换符,这个符号呢,就是一对小括号。
04:00
这就可以了,下边呢,就是说使用的时候呢,注意点。这时候注意点,这呢我们就提到了,首先那你强转向下转型,我们说可能会出现这个异常,这是第一个小点。可能会出现这样异常,那既然呢可能出现这样异常,怎么解决呢?我们说为了避免在线下转型的时候呢,出现class class exception,所以呢,咱们在强占之前需要进行ince的判断,要处了我就转,不是处就不要转。这呢是咱们说的这个支点。先进行好,这呢,就我们说的这个事儿。CTRLS一下,这就是咱们线下转型的这个算是核心的内容了,接下来的话呢,我们把这个知识呢,就回归到说对这个CE这个关键字的一个理解了,那么它是怎么使用的呢?首先我们这个关键字呢,前面有一个东西,后边有个东西,前面这个呢是一个对象。
05:04
或者你说是一个对象的引用也可以,因为咱们说对象呢,都是就凡是这个数据都是通过这个变量名来调的,对于咱们这个对象来讲呢,我把这个变量名呢,叫做引用了。有的时候我说是一个对象,有的时候就相当于是其实你本质上说的是它,但是我们都是拿这个变量名来引用的,所以这个A呢,你说这是一个引用也行,说它是一个对象也可以,它代表的其实就是你这个对象了。左边呢是一个引用,或者说是一个对象instance of,右边呢是一个类型,这俩地位不是平等的,就是或者说这类置对象,这是两个概念,我判断一下这个对象是不是我们这个A这个类型的一个实例。其实在这块呢,也存在所谓的叫多态性了,我这假设是一个new的一个慢这样的一个对象啊,我这A呢是慢的一个负类,我们说这是不是也返回的是个处啊。
06:03
相当于也是有这种多态的这种情况了。就是我是一个男人,那其实你也是一个人,就相当于这个意思啊,说你是不是人的一个实力也是是的,虽然你实际上拗的是一个男人,当然你也认为是父类的一个实力,那说白了就是相当于还是你把这个相当于还是把这个子类的一个一个一个对象,你认为他是他的一个实力了,就是相对还是这种形式了。就这个意思,所以这块使用的话呢,我们先要明确这个CE这个关键字是怎么用的。这是第一个点。好,那么具体的话呢,我们又提到另外一个事儿,就是如果呢,你这个判断的时候呢,这个是类型A返回数了,那么类型B呢也一定是数,其中呢,这个B呢是A的负类,这就咱们所说的这种情况了。行,这两个的话呢,大家要关注一下,这是我们提到这个知识点,就是关于instance of这块使用的时候,这个点实际上呢,还有一个点,还有一个点的话呢,其实咱们在用的时候呢,也体现过这个事了,只是呢,我没有明确的把它写出来,在我们这个PPT里边,大家看在这呢写着呢。
07:21
说我这那会儿用的小A,这用的是X,如果我们要求这个X所属的类呢,与这个类A必须是子负类的关系,否则呢,编译错误,这个能理解不?嗯,对,这个得清楚,这个写成一个三。这是使用上的一个,算是一个要求,也是。保存一下,这个事呢,我们简单的来说一下,这我不妨就写到这了,你看我们这个P2,咱那P2呢,我声明的是一个person类型的,所以你右边这个位置写的时候呢,这个类型要么呢,这个这把这个改成一个A是吧,忘了啊,这个右边的话呢,你要么呢是这个person的子类,要么是person负类,它跟person呢,它得有点关系才行,你不能怎么着呢,不能假设我们我在这就演示一下,我这有个class是一个order,这个时候这个order呢,跟我们的这个person呢没有任何关系,然后你在这块呢,你想写一个说说if,这个PR呢,叫instance of,写一个order,这个它是肯定要报错的。
08:27
也就是说呢,像这种事啊,你就不要去让这个解释运行器去做了,我编译器我就可以帮你搞得定。大家我们说Java程序呢,有一个编译过程,有一个运行过程,你可以看成是两道关卡,第一道关卡呢,先给你过了一下这个基本语法,然后这都没有问题了,以后运行这块呢再去做。啊,就是这样一个情况,那这块呢,像这个事儿就不会像上面这个问题,你去交给这个解释运行器去看一看,说你这个PR到底是不是它这个实例,那是解释运行的时候解决的,现在呢,我编译器我就可以帮你给你过滤掉,这个事儿呢,肯定成不了啊person呢,跟我们这order就没有任何关系,编译的时候呢就过不了,所以说要想编译过呢,这个他们一定得有子父类的关系才行,包括你这写一个死string啊啥的,这这都不靠谱,没有子父类的关系呢,这是绝对不允许去进行这样的比较的。
09:18
啊,这个事儿呢,大家注意一下。这个就留着吧,就是这个位置呢,可以是一个负类的,没问题,比如说person呢,你这写个负类,写个object那是可以的,这不这不是写过吗。好,这呢就是说的这样的一个问题过了啊,那接下来的话呢,这有一个图示,这个图示呢,其实大家一看呢,诶就非常的清楚了,因为跟我们前面讲的关于基本数据类型的向上转型,向下转型这是一致的。只不过那时候呢,咱们叫自动类型提升和强转了,这呢叫向上转型,向下转型,其实是一个意思,就是叫法区别而已。好,这呢就不多说了,下面关于这个面试题,在这块的话呢,两个比较典型的面试题,第一个说你对多态性的理解这个问题。
10:10
怎么打呀?如果要是问你对封装性的理解,会说吧?封装性,封装性的话呢,只要一说封装性,我们其其实追求的呢,就是说或者封装性的一个思想什么呢?就是我们这个这个把这个信息呢,我们现在基本上都封装在一个类的概念当中了,然后这个类里边呢,定义了很多的功能,我们呢,这个不想对外暴露呢,咱们就给它可以体现的权限比较小,想对外暴露呢,你就可以对外开放一些接口了,权限也比较大,所以总体上来讲呢,就是体现为四种权限修饰。这样的一个情况去描述我们这个封装性了,那么继承性呢?继承性主要追求的就是让类跟类之间产生一种叫继承关系,从而呢达到这个代码的一个重用。
11:04
对吧,我们再去造一个类的时候呢,不用大家再像白手起家一样,一点点去构建它的内部结构了,我直接继承以后,直接呢,就获取了这个负类当中的这些结构,包括呢,它可能还有负类,不管它这个副类这块能拿直接负类能拿到它的间接负类呢,结构也可以拿到。就成这样了,这那是我们这个继承性想描述的情况,那多肽性怎么说呀,他到底是想做什么事啊。这个多态性尽可能想做的事呢,就是能够实现这个代码的一个通用性是吧,大家答这个多态性的时候,其实脑子里边你就想上,想上一个比较好的那个实例就可以了,就是像咱们object的这个类中定义的这个E的方法。
12:03
嗯。你看我们object类当中定义这个异构方法,这个方法呢,咱们说了后边还是很常用的,不管是string也好,还是咱们自定义的类也好,自定义类的话呢,还经常呢需要去重写,重写的话呢,也都是重写的,Object类当中的既然是重写了,咱们讲过重写的方法呢,这个方法名和形态类表呢还都得一样,那形态类板呢,放的都是object。那我们具体比的时候呢,咱们不是说呢,放的就都是用了一个object,那其实没啥意思了,Object本身呢,他也没有属性,没有对外暴露这个属性,那你去比较它所谓的属性没有任何意义,所以咱们真正去比较两个对象是不是相等的时候,那通常放的那一定都是子类的对象了,那你能放子类对象,就是因为你这块存在多态性。所以呢,咱们多态性达到一个目的呢,就是希望实现这个代码的一个叫通用性了,就是我这时候的这个方法呢,不光能够把这个object类型new一个object放进去,我还可以放它所有的子类对象。
13:13
这样的话呢,你这个方法呢,是不是就明显体现为一个比较有通用性的一个操作了。对吧,嗯,就是大家去体会这个事情,然后这个二的话呢,相当于是一个举例,那这个举例呢,其实除了它之外呢,后边呢,再举的话呢,嗯,咱们到后边呢,讲这个知识,就讲完Java基础的以后呢,咱们会讲数据库,讲完数据库以后呢,我们会讲一个技术叫GDBC,这个GDBC呢,最简单来说,它的作用呢,就是使用使用Java程序去操作数据库。这个操作数据库呢,那就涉及到了一系列这个操作了,那都有什么操作呢?就是首先呢,我们得能够叫获取数据库的连接。就像大家你上网一样,你上网的话呢,你得首先呢得有网,你得先能够连接到这个Internet上,获取输入连接以呢实现对数据库的叫增删改查,增删改查呢,我们简写为叫c rud操作。
14:11
C create就相当于是添加一样啊二呢,Retrieve检索you update修改d delete删除就增删改查操作了,我们呢,使用Java程序呢,可以对数据库呢进行这样一系列操作,那进行这些操作的时候呢,那咱们呢,其实也会涉及到很多的方法,这些方法的这个参数的话呢,也通常都是一个负类的类型。为什么要写成负类呢?因为咱们实际调的时候呢,放的都是子类对象,那子类对象都有哪些呢?你是不是有好多的数据库啊,那这呢就体现了你有myle,你有这个这个Oracle,还有这个这个DB two DB two是谁家的IBM的circle server。微软家的等等,像这些呢,算是比较常用的一些数据库了,那我们调这个Java应用程序,这个时候呢,咱们Java呢,已经给咱们写好了很多的这个API了,就是为了方便咱们作为Java程序员呢,去去调去获取数据库的一些这个操作,那就是实现对数据库的一些操作了,那我们就类似于像ES一样,会放很多的方法这个参数,参数你写的时候呢,你就不能光写MYSQ的这个这个这个类型了,你写MYSQ的话呢,Oracle用不了了,那其他的都用不了,所以我们这时候呢,你放的时候也只能是放一个副类的类型,那么真正我们这个调用的时候呢,我们都是new的具体的这些数据库,他们提供好的,我们Java里边提供的那些API的子类。
15:45
我们就放这个子类子就行。同时的话呢,你在这个方法里面,咱们呢,编写这个方法的时候,这是Java,或者我们说叫散公司啊,虽然现在没有散公司啊,但我们一说散,你知道是Java这个体系的,我们让这个散公司呢,它去定义这个负类中的一些功能,我们在这里边呢,从形式上来看呢,就先去调用那些负类中声明的那些功能,就是所谓的被重写的方法了,当你真正执行的时候呢,我们给你放进去一个子类的对象,那子类对象像MYSQL怎么去连接,怎么增生改差,因为你针对的是MYQL了,它是不是一定会去重写父类中的这些方法呀,对,那重写以后,你里边虽然呢,编译的时候认为你调的呢是副雷动的方法,但真正运行时候呢,都是你自己里边特有的方法了。
16:32
对,那你这个代码呢,相当于我们就执行成功了,那你今天呢用的MYSQL,明天呢,我说我不想用MYSQL了。这个代码呢,你想想是不是不用改,我这时候呢,只需要把Oracle的这个对象我给你塞进去里边这个方法的话,你自动的是不是就调成是Oracle的这个重写的那个方法了,对这样的话,你想我们这个代码呢,是不是就更好的体现了叫通用性啊,哎,就是这样个原因,就是大家呢,其实说这种概念性的东西,尤其是他越难理解的时候呢,越怎么着啊,越去想这个实例,你去想开发商怎么用的,你能把怎么用的这个事说清楚了,那就认为你是懂这个事了。
17:10
就这意思,那么再从一个角度去说的话呢,这个我们现在还说不了,但是我就先写出来,就是关于这个抽象类和这个接口的使用,今天呢,咱们也这个详细的就说不完这个事儿了,这个再来的时候呢,把这个抽象类和接口呢就能够说清楚啊,就是在我们这面向对象下的这个位置,这呢就是关于这个抽象类,这是关于这个接口的事儿啊,那回过来什么意思呢?就是如果要是没有多态性的话,抽象类和接口呢就没有意义。就是抽压类和接口的使用呢,必须体现,或者叫肯定体现了。多态性主要原因是什么呢?是因为这个抽象类和接口呢,不能实例化。
18:06
就是抽象类和接口呢,是不能够造对象的,你想想如果要有个东西,它现在不能够直接去拗个对象,那我们还声明是这个类型的,声明是这个类型的变量呢,你要想不出错的话呢,还一定得给它赋个值,不赋值呢,这不走不了是吧。那你给既给它赋值,但是它自己又不能本身的去拗,那你是不是就只能够去拗它的子类的对象F啊,或者是这个接口,我们就要实现类的对象了,那你只要是你的子类对象或者是实验类的对象了,那就一定是多态了,所以说呢,抽下类和接口,你要是没有多态的话,这两个结构Java中就没有必要去定义了,因为根本就用不上啊,就这个意思了,所以呢,这块呢,其实也是可以体现我们这个多态性的一个意义的啊,就这么个意思啊,行,这块的话呢,大家后续的话呢,再想着怎么能够把它描述清楚,就是有一些知识呢,你看我们现在其实还没有讲到这个,讲到以后呢,你说起来就会更有底气一些,就像开发的时候,就像这个面试的时候,这个东西你不会去干,去硬背的话呢,其实还是心里边没底,所以还得是基于你会用熟悉,然后呢,你只是复习了一下啊,说怎么系统的把它描述出来而已,这是这种啊,下个呢,说多肽式编译行为还是运营行,运营式行为咱们说过了是吧。
19:21
对,是一个运行时行为。这个证明的话呢,这客户呢,是不是也写了一个这个证明啊,对大家呢,你就看这个证明就可以了,这个证明写的还是比较好的,直接再取一个随机数啊,你编译的时候根本看不出来它到底扭的是谁,只有运行才知道,行回过来这个就过了啊。
我来说两句