00:00
复习一下咱们昨天讲的这个内容,昨天呢,咱们这个视频的时间呢,稍微比较长一些了,这个有点让大家受惊了是吧,讲的多了啊。这个但是呢,我们复习的时候呢,把这个内容呢,再变薄一下,其实我们核心需要关注的点呢,其实有限。啊,其实有限,那么昨天呢,我们主要呢,就讲了三个事情,抽象接口和内部类,那从这个视频的时间上你也能看得到,肯定呢,这个抽象和接口呢是重心了,那包括代码呢,你也能看得出来,那么首先呢来看看这个叫抽象,首先obstract这个关键字呢,一般咱们习惯上都去翻译一下了,抽象的对,刚才也考了用来修饰这个类方法,对就这两个结构,那具体的话呢,修饰类修饰方法咱们那会儿呢,考试也让大家去试图的去描述一下了。这呢咱就直接拿过来说abstract呢,去修饰个类,我们就叫做抽象类,这样类只要一看到抽像类就不能实例化,这个脑子里边直观的去反馈啊,然后接着的话呢,说这个抽象类里边这个一定会有扩到期了,这个不是说让你去造对象的了啊,是让这个子类实例化的时候呢去使用的,然后呢,开发当中,我们这个有抽象类,它既然不能实例化了,都得需要去提供它的子类,让子类呢去实例化,完成相关操作。
01:23
这是关于抽象类的内容,通过这个的话呢,我们其实也能看得到,就是说我们这个抽象定义了这样的一个结构,叫做抽象了,它的一个使用的大前提就是我们需要提供它的子类,那就依托于继承性。通过这个呢,这不就能看得到吗?只要你看到一个类是个抽象类了,那我们开发里边用肯定就会有它的子类,哎是这样子的,通过这呢,我们去体会一下,说这个抽象的,抽象的这个叫使用前提了,相当于就是一个继承性,就是继承性,昨天呢,其实咱们还提到说抽象类,另外一个使用前提呢,涉及到叫多态性啊,那那是因为咱们在调一个方法的时候,嗯,这这个这个我就简单在这写一下,比如我写个方法public VO,我这有个method方法,我们这个方法的这个行参呀,它是一个抽象类类型的,比如我这个person类是一个抽象类,那么我们再去用这个person类的时候,你去传13的时候呢,传的一定是实现类S此类的对象了,所以这块呢,体现的就都是我们说的,哎,多态性了,就多态性了。
02:38
行,就是这么个情况,因为呃,这是我们这样写,就是另另外的话呢,就是即使你在一个方法当中,哪怕你写一个main方法,就只要呢,你这块呢,涉及到说我声明的时候呢,是一个抽象类了,那右边呢也一定是子类的对象。那这呢,其实也是多态性,相当于呢,就是我们这个ofstra这个类呢,在使用的时候,凡是呢,你要是声明成一个负类这个类型了,那这一定是多态性的体现,你要这块呢,声明的是一个子,这个它的子类的一个类型,那可能就没有多态性了,那只是体现了这叫继承性。
03:11
那本身多带性的使用前提也是继承性,所以这个呢,是它一定哎会体现的一个点,行,这是说的这个关于抽象的类,然后抽象的方法。其实呢,大家现在去看这个抽象类,抽象方法其实还是挺简单的,甚至说比我们讲的这个继承性呢,还是要简单一些。继承性呢,咱们说啊,继承以后又涉及到重写等等一些问题,哪些结构拿到了哪些有没有,那其实抽象的话呢,只是在继承的基础之上,你把那个复类抽象一下,有的方法呢,子类又重写了这个父类这个没用了,把父类这个方法也抽象一下完事啊其实只是在原有继成的基础上呢,我们做了一些改变,就是一个抽象的点了行,那具体的使用上的一个注意点,这呢,咱们又写了个这样的代码,说了这样的两个事情,CTRLC。
04:10
这样这个抽象这个uptra关键词呢,它稍微特别一点,它呢说有些东西呢,它就不能够跟别人共用了,这个呢,大家出现这个异常的时候,出现错误的时候呢,你能够稍微分析一下,知道为什么说不可以就可以了,那像这个obstract修饰这个静态方法,咱们昨天也讲过了啊,那现在看还记不记得,比如说obstract修饰方法的话呢,这个方法呢,说不能是个静态方法,想想为啥静代方法不能够被重写是吧,那不能被重写,这是我们当时昨天解释的一个角度,哎,没有问题啊,那其实还可以怎么解释呢?这个方法是个静态的,对,哎,说的是对的啊,你看我这个方法呢,这个是个静态的还是个obstract obstract呢,就意味着它没有方法体,只有这个小括号这了就没有方法体了,那我加上of加上。
05:10
Static假设呢,你能用static修饰,是不是就意味着我们这个类呢,又可以去掉了,那类去掉又没有意义了,咱们当时说一个方法呢,生明成abstract的时候呢,是没有方法体了,咱们当时说呢,这个方法呢,就不应该被调,当时咱们呢是没有用static,没有用static呢,说明你这个方法呢,只能是被对象去调,那我这时候呢,是不是就不让你有对象,就不会出现被调用的事了。怎么就没有对象了呢?我们把这个类呢,是不我选一下,诶这那这样的话,你这个类呢,就不能造对象了,你不能造对象,这个抽象方法呢,就不会调用,诶就没事了,那现在的话呢,说哎,我这个方法static了,我1STATIC,那就意味着这时候呢,我也用不着去用我这个类的对象了,我上来我这个类就可以干这个事,那类要做这个事的话呢,显然你这个方法呢,要被调用又不对了,那这时候说呢,你就不能让这个类去掉,这个方法不能让类去掉,那就是不要加static呗,你总不能把这个类给干掉吧,那就没了是吧?哎,那你只能把static去掉,那就意味着说这个abstract跟static呢,他俩也不可以共用。
06:24
哎,像这些点呢,这不咱们都是基于大家会了static,会了abstract之后呢,诶你往一块拼的时候呢,发现有些逻辑呢,是推不动的,这就说明他们是矛盾的,它就不可以啊。行,这呢是说的这个注意点,注意点这个呢就过了,嗯,然后下面呢,关于abstract的这个应用举例,应用举例这个呢,咱们昨天讲课的时候呢,这不也举了这个相关的一些这个例子。嗯,举个相关例子,比如说呢,咱们可以课件当中。找一下啊,应该是在在这了,这呢是咱们昨天也算是举的一个例子,就这个呢,没有涉及到这个具体的这个代码了,我们这呢,有个叫交通工具这样的一个类,交通工具这个类的话呢,这个它里边有这个燃料的计算效率啊,行驶距离啊,但是呢,作为一个普通的一个交通工具,没办法指明,所以呢,我们这呢,呃,就把它定义成是个抽象类,然后呢,让具体的子类去重写这些抽象方法,这呢算是咱们昨天涉及到的一个例子。
07:35
这个呢可以看成叫举例一行,这是一个它,然后呢接着举例二,举例二昨天呢,咱们提到了一下,咱们之前写的一道题目,叫只有metric object,这呢是一个负类,这个负类里边有个方法叫做public,返回一个double类型呢叫find area求圆的面积,但这个求面积呢,一个几何图形不知道是什么,所以这个方法呢也没法写,所以我们也声明成abstract,那进而的话呢,当前的类。
08:10
这个类呢,也是OB的这样的一个类,那接着的话呢,我们去提供它的子类circle,让它呢去继乘于我们的这个集鹅出行类。结束以后,这时候呢,你显示的把这个方法呢,去重写一下,或者叫实现一下,应该说啊。这个呢,你去提供这个具体的这里边儿的操作。我们在这return一下,哎,3.14乘以咱们这个readdius,诶这样的就可以了,这呢你再多一个这样的一个属性,行,这呢就相当于也体现了咱们这个叫抽象性啊,这个抽象的一个体现,实际上呢,就是在开发当中,咱们在原有的继承的这个体系的基础之上呢,你把这个父类当中的有些功能,如果说确实没办法指明,怎么去写,或者说呢,你此类反正一定要重写了,那这时候呢,何部给他抽象一下,让这个子类呢,一继承的时候呢,就报错,就是明确的指明说你要是想实体化,必须呢重写,或者必须要实现哎这样的一个意思,那这块呢,你把它再加上一个shift,让它呢不要去造对象了就可以了,诶就可以了,这是一个举例二,然后后面呢,我们再举一个要用到的一个结构,就是后边呢,咱们会讲这个lo硫。
09:31
这个L流里边呢,会涉及到几个叫抽象的类,涉及到到的这个叫抽象类,这呢就涉及到叫input streamam,还有这个叫out put stream。还有这个,呃,Reader跟writer这样的几个结构。行,这呢我就简单看其中一个,这个叫input stream crl c一下,我们在源码里边看一看,Ctrl shift t crl v input,我们会看到这是一个abstract这样一个类,那么input stream是干什么用的呢?从这个名字上你能看到它是一个跟输入相关的一个流,这呢就涉及到咱们这个数据啊,比如说在硬盘当中的某个位置上有个数据,然后这个数据呢,我们想把它呢读到内存当中,比如你这个文件里边就写了一个hello,现在呢,我希望呢,把这个内容读到内存当中,生成一个字符串,这个字符串呢就叫hello,就相当于把这个内容呢,我们给它读进来了,那怎么从硬盘中把这个内容读进来呢?我们可以考虑使用这个叫input stream啊,或者准确的说,你要有文本,后边咱们还有叫reader啊,这个咱们就先不说那么细了,这个类的话呢,它是一个关于读数据相关的一个类,但是这个类里边呢,它叫abstract,它里边呢有这个抽象。
10:57
的方法,这个抽象方法呢叫做read,就是你你是读数据,这个读数据呢,它就叫做read方法,这呢它定义成个抽象的意思,就是说这个我只不太明确,不知道该怎么去写,就像我们说这个几何图形的,你这个求面积一样,那为什么说你这不知道怎么写呢?因为在实际操作当中啊,我们这个读的这个事儿啊,千变万化。
11:21
我们这个input stream下边你会发现它定义了很多的具体的子类CTRLT。你看它下面它定义了很多的这个词类,为什么呢?就是因为这个我们去读东西的时候呢,它这个特点呢很多,有的呢我们是用最普通的一个叫file input stream,有的呢又想这个具有缓存这个功能,比方buffer input stream,有的又涉及到其他的一些读这个图片呀,或者你想读这个对象呀等等相关的,它有不同的,针对不同实际情况读的内容不一样,所以这个时候呢,你在这个副类当中啊,把这个瑞的方法你写明确了也没有意义,反正你子类啊还要重写,所以干脆我们呢,就提供一个抽象的一个负类得了,然后子类呢,看你具体读的是什么信息,你就把这个read方法呢做一个重写就可以了,所以这呢,都是体现咱们这个叫抽象性的这个点啊,就是这几个是几个这个抽象的这个这个类啊,然后在其中。
12:24
这个我们说在其中或者在其内部。内部,然后定义了这个抽象的这个叫read方法,这个是对于读路的啊,那你要是写出去的话呢,就是和RA这个方法。那因为呢,它具体不明确,到底该怎么去读和写,我们呢需要提供它的词类啊,去重写这个read和write方法,行这呢就是咱们这样的一个举例啊,那后边呢,大家看到这个抽象的话呢,其实嗯,第一反应其实它没有多难啊,不是特别困难的一个事情啊,行,那么昨天你要说这个难点的话呢,就是咱们又涉及到几个设计模式,那说了反来翻来覆去说了好几次了,这个设计模式的话呢,这里边讲了这三个,大家不要把它呢跟我们这个单利模式呢,放到同一个这个要求的级别上,这个单利呢,是需要大家一定要能手写的这个模板,还有这个代理工厂,这个不需要大家呢,就当做是我们这个这个抽象或者是接口的一个具体的一个应用题,应用的一个小练习就可以了,那我们讲课的时候呢,稍微也说了一下它的一个功能,但是你先不用特别去关注,首先关于这个模板方法设计模式,它的解决问题,这个我们看下这个PPT了,他呢,呃,就把这个事呢,我们拿过来。
13:42
所以呢,在软件开发当中,我们实现一个算法的时候,这个整体上的话呢,我们这个步骤呢,是一个固定的,诶这个整体是一个固定的,但是里边呢,我们也会有一些这个不确定的部分,这叫异变的部分,那么异变呢,不确定的我们就给它抽象化,然后呢,在具体的子类当中去实现,但是呢,我们这个固定的这个结构,通通用的这个结构,它还是一些非抽象的方法,哎这个我们具体调用的时候呢,在此类中还是要调用这个非静态的这个方还非抽象的方法的啊好,那具体的举例呢,咱们这个自己写了一个,就是关于这个算到底需要花多长时间啊,某段代码这样的一个操作,那这个事呢,我们可以把这个诶拿过来,这呢,就是一个模板的设计。
14:35
嗯,大家呢,现在也是就是先不用太去纠结,说这个模板我怎么去把它体会的多么深刻,因为呢,你建的东西来比较少,我们只是先引进来了,说这呢就是一个模板啊,那么后续呢,我们在哪些方面会用呢?这个到时候用到的时候呢,大家你去关注一下这就可以了,尤其像我们到web的时候呢,大家就会接触到L,这个呢,你就能看到,哦,原来这其实就是一个模板,嗯,像这这个do get do post,咱们呢需要去重写,但是呢,我们并没有显示的去调do get和do post,其实就像我们这个模板这里边一样,咱们呢,在这个此类当中,咱们自己写了一个扣的方法,但是你看你上边调的时候呢,我们可没有明确的去点这个扣的方法。
15:21
就是因为呢,咱们调的这个叫spend time这个方法呢,它里集成了对我们这个扣的方法的一个调用,你只需要把里边不去的这部分你重写完就行了,具体调你不要直接去调查,我去调另外一个呢,诶有这个方法体的一个方法,里边呢会嵌入对你这个调用,后边呢,你去web的时候呢,你就能够看到它其实也是这个样子的,到时候见了以后,大家也是先用,就让你去重写do get do破,该重写就重写,然后重写,你知道它就能掉,然后呢,回过来再一看,诶你在哪掉的,凭啥能掉,这是一个什么样的结构啊,一看原来是个模板,哎,就这样去体会,就是以这个这个理解上的一个先后啊。
我来说两句