00:00
诶看一下咱们这五道问题啊,这个昨天呢,咱们把面向对象的这个内容呢,就给结了,主要呢,就是讲了三个事儿,抽象,然后接口,还有内部类这样三个问题,那么中心的话呢,肯定是抽象这块,还有接口,这肯定是咱们的中心了,不光是咱们这一章的重心,也是呢,整个面向对象呢,其实也是个重心,哎,好,那我们呢,看一下这几道问题啊,第一个那抽象呢,我们涉及到这个关键字呢,叫obstract,哎,Obstract呢说可以用来修饰哪些结构,呃,修饰以后有什么特点,那obstract这应该都清楚啊,修饰类方法别的别的就没有了,嗯,就是咱们呢,把这个关键字呢,基本上也都讲完了,当然呢,关键字不是说,嗯这个这个后边章节就没有了,也有就是涉及到面向对样专门的这个Java语法这个层面的,我们就算是讲的清楚了,那讲清楚以后呢,像有几个这个这个大家容易混的啊或者。
01:00
这你下来呢,需要有必要总结一下的,就像这个static能够用来修饰什么,Final用来修饰什么,Obstract用来修饰什么是吧,尤其这三个呢,你得稍微整理一下啊,这个别整混了,好,这个能够用来修饰类和方法,修饰以后有什么特点,这个应该都比较清楚,或者得需要清楚才可以,如果我们看到一个类生命成abstract了,这个第一反应是什么呀?对,这个类呢,就不能实例化了,类不能实例化,这个最直观的一个反馈啊,那么不能实例化了,像这个类一般我们都怎么用啊,是不是得提供这个子类啊对,提供这个子类,让这个子类呢去实例化,对,也就是说呢,咱们这个抽象呢,其实他要想使用那个前提呢,实际上他也得依赖于我们那样对象的继承性。得有这个继承性,咱们要面向对象,那咱们绝大部分的情况下都是创建类的对象去完成这个操作的,当然了,咱们说除了这个之外呢,咱们还可以静态的结构直接通过类去调用,这是其中的一个有利的补充,那么现在呢,这个类呢不能实例化了,那我们一定得考虑提供它的子类,让子类呢去实例化,所以这块呢,提到了一个子类的问题,那就得依赖于这个继承性,那这样才可以啊,那当然还有其他的一些点,咱们就具体的细节呢,就先不说了,就是主要呢说这个点,一会复习的时候呢,细节的再说一下,那这是关于这个类了,那么abstract修饰个方法,你一看到一个方法是abstract。
02:32
想到什么事啊,对,首先你这个方法呢,它连那个大括号没有了,就没有具体的这个方法起了,那么这个方法的话呢,我们说叫一个抽象方法,那么抽象方法一看到它,首先呢,它所在的类呢,就一定得是个抽象类了,对,然后这个方法的话呢,虽然没有个方法起,但是这个方法它的功能是什么,实际上是确定的,实际上是确定的,比如你这个方法呢,通过方法名你能大概知道他要干什么,可能还需要一些参数也写上了,然后这个反问类型呢,表达的是什么意思,其实也都确定下来了,只是说呢,具体怎么去实现呢,可能跟那个子类有一些关系了,父类这块呢,根本就没办法明确,所以说我们这个抽样方法呢,要想使用它,那这个抽样方法必须要被实现,对吧?诶这个是我们最直接的这样的一个点,就是抽象方法。
03:26
抽象方法呢,其实相当于也就算是定义了一个标准一样,就是我们想做个什么事儿,这个事儿呢,需要什么参数,返回值是什么,其实相当也是一个标准,但是呢,没有具体的实现,所以抽象方法呢,我们说呃,要想使用啊,或者讲体现它的这个使用呢,或者这样说吧,抽象方法只定义了算是一种这个功能的标准,具体的执行需要这个子类,子类这个咱们一般呢,这个抽象的方法昨天提过,呃,有时候就不爱叫这个重写了,对,咱们就叫做实现,需要子类呢去实现,诶就这样个意思啊,行,就是主要呢,大家把这个核心的内容你抽取出来就可以了,具体的那些咱们细节上次呢讲过的,你下来呢,看看咱们这个eclipse当中写的那些注释啊,一看都很清楚就OK了,然后呢,再就做做练习啊,就可以好看第二题。
04:27
说接口是否能继承接口呢?那么能,这个你不能继承接口,那接口跟接口之间关系怎么体现啊,它就叫继承不叫实现啊,接口跟接口之间还是还是继承那接口,那这个这个抽象类是否能实现接口呢?不能让一个抽象类实现接口吗?能有的人说昨天没讲呢,没讲的东西那多了,对吧,细节东西呢,太多了,你不能都讲,但是你基本的东西咱们讲完以后,你得能推啊,这个是不是就可以推啊,我们写这个类,你让他去试看接口,咱们说了接口中的抽象方法你都得重写一下,这样你才能实例化,那要没重写完呢,你如果抽象类,这不就相当于把这事就说了,那你反过来说抽氧类能实现接口吗?你不能,那不能,那不可能啊,是吧,这不就抽象类吗?对抽象类这不就实现了个接口了,OK的啊,下一个说抽象类是否。
05:27
能继承非抽象的类对不对?非常结不能抽象类,为什么不能继承非抽象的类呢?可以的呀啊,不是有同学都说到不Jack了吗?我一个抽象类没有明确指明它的副类,那负类是谁呀?那不就object吗?Object不就是一个非抽象的类吗?对吧?也别学蒙了,一个抽象类没有明确指明负类,那负类不就是object吗?Object又不是抽象类,那你这不就是个抽象类继承一个非抽象的类了,对吧?就是像这些事的话呢,也就考试的时候会说,平时写代码时候大家可能没有去注意这个问题,就平时写代码写的挺嗨的,这个回过来可能猛一下问问懵了就是吧,没问题啊,那反过来说,一个非抽象的类能不能继承一个抽象类啊?
06:25
那太能了是吧,太能了,这要都不能的话,那你这个子类没法用了哈,这都抽象了成了是吧,这都可以的啊这三个能。下一个说声明一个抽象类包含抽象方法测试类当中呢,创建一个继承抽象类的匿名此类对象,这个呢,昨天也还算是一一些这个小的问题了,就这块呢,在咱们开发当中呢,有时候会出现这样的情况,这个包括咱们下边提到的抽样类和接口这两个结构的共同点呢,就不能实例化了,既然不能实例化呢,我们得需要提供他们的子类或者是实间类,然后造子类或实间类的对象,但如果呢,你这个子类或者实间类呢,我就用一次,那干脆就匿名得了,所以这呢就提到一个叫匿名子类的问题,比如说呢,我这呃,Tract简单写一下,我这呢就写一个A,这样个类里边呢,你写一个最简单的格式就可以了,Public abstract word,写一个M方法,首先呢,这个得写对,接下来的话呢,这个测试类,测试类我就简写了,只写一个专门的测试方法了,呃,没方法,在这没方法里面我们呢需要去。
07:38
创建一个匿名此类的对象,你可以给他还声明成是这A类型的,写个小A,我就拗一个AA这个样子,但是呢,人家这是一个抽象类,我们其实这个A呢,就表示的是一个匿名的一个结构了,在这个整个大括号,把这大括号拉下来,在这个位置,对我们呢去public word写个M方法,这个呢是有方法体的,这个你你随便写个信息都行,或者你哪怕这样空着都OK,这呢就相当于我们创建了一个叫匿名子类的对象,对象呢是有名的叫A,就这个意思,就这意思。
08:19
行,那创建完以后的话呢,你下边这个A,你可以去调你这个M方法,我们通过这A调M方法编译的时候呢,他认为你还是这个抽象方法,因为这其实相当于是一个多态的形式了,那当然你实际运行的时候呢,还是我们重写以后的这个方法,或者叫实现以后的方法抽象的了啊,这叫实现了。就这样,所以这呢,还是基于咱们已经讲过的这个知识,继承多肽在咱们这个抽象当中呢,其实都有所体现,这就没有了,行,那个接口也是一样,就是抽象类这个格式,大家清楚以后呢,那接口其实跟它类似,那我说这是个接口,你把上面这改成这个接口,这接口你有一个这个接口的这个,它不就相当于是接口的匿名实现类的对象,诶就是跟我们这个抽象类这个格式呢,其实是类似的,那其实呢,我们可以再推广一下,再推广一下,比如我这个AA这个类呢,我就不一个抽象类,也不是一个接口,就是一个普通的非抽象的一个类,我能这样的格式去写吗?
09:21
可以吗?那个没写过可以的,比如说我们这我有一个class,一个person person里边呢,咱们有这个之前不是说过像string性的name,包括咱们来一个public word写个的方法,这有一个方法体了,我就省略了,这呢是一个正常的一个person类,然后呢,我们在这个测试的main方法当中,对吧?当中原来呢,咱们这个你new个person,那就造了个person对象,或者你去new一个person的此类付给person啊这多肽,那其实也可以这样,我person p等于new一个写个person,这呢相当于是你造了一个你自己这个类的对象,那我现在呢,就在这个位置,我整一个大括号,我再回过来这个位置,我再public word,我写个it,重新呢,相当于是做了一个重启,然后呢,我这时候再没出来在这儿呗,我P点一挑方法。
10:15
这个医疗方法是不是也是相当于执行了它呀,对,这也叫,这也叫这个匿名子类的对象,只不过呢,以前咱们不太习惯这样去写,这个类的话呢,本身就有对象,那咱就造它了,你要是有此类呢,我就造此类对象了,所以没有这样的去做,原来呢,其实也可以的,只不过现在呢,有这个抽象以后呢,我们这个这个必须要去重写了,这是我们这个才引出来这样的一个结构而已,啊行,这是第三道问题,第四道问题,这道问题呢,其实比较大了,也是一个比较经典的面试题,就即使不是面试题呢,大家也需要去整理一下,说这个抽象类和接口,这个咱们也是放在一起讲的,说这两个结构呢,有什么共同点和区别。
11:00
嗯,找同学来说一说生类和接口哪些共同点和区别,潘宇生吧。这个都不,这是相同点是吧,不能实例化,嗯,对,没有共同点,可以说不同点啊,还有吗。这是算不同点,这个哪个有构造器啊,上类呢,这个是有构造器,嗯,而我们这个接口呢,是不能声明构造器,嗯,然后。还有吧。你你看我一眼还有不没有就你就想不起来了,就想不起来了,你没事啊,但你别这样愣着是吧,那同桌周兄相同点怎么着都可以被继承啊,这这嗯,都可以被继承,这要再往下一展开,就算不同点了,就是吧,嗯,然后。
12:27
接口可以被多继承,嗯,然后这个抽象类呢,它是对单继承性,嗯,这关于这个多继承和单继承的区别。对,就是抽样类和接口是两个并列的结构,一个是类体系的,一个是接口体系,嗯。想不起来了,行,那再接着这个吴非有补充的不?嗯,就是定义的方式不一样啊。
13:09
Implement就实现的关系对吧?对其实这块呢,这道问题,嗯,还有不没有了,其实这个问题的话呢,没有说,严格的说,大家非得咔咔咔咔每一面都得说清楚了,这个其实要说的话,里边的不同点还是挺多的,其实咱们开发用的话呢,这个用的也是这个一说到抽象类啊,用抽象类的啊,接口用到接口了,这块呢,比一下,那你就把他们这个各自的这个结构和这个定义的这个特点说一说,其实主体上都是不同的点,相同的点的话呢,其实相对比较有限一些,比如说呢,刚才提到了最明显的不能实例化的问题啊,这是要提一提的,另外的话呢,就是它内部的话呢,大家都可以定义这个抽象的方法,这个抽象类呢,说不一定有抽象方法,而这个接口当中,通常咱们都会去定义抽象方法,接口中呢,主要呢,我们说它定义的就是一种规范,这个规范呢,其实主体上来讲就是通过这个叫抽象的方法去体现的,我只定义了这个规范,没有具体的这些实现,这叫这种规范的这个概念啊。
14:09
当然了,我们这个JDK8以后,这就涉及到我们这个说不通点的时候呢,大家可以把抽象类和接口呢分别的去介绍一下,就抽象类里边是什么样的点,其实呢,就是抽样类可以有抽样方法,那也可以没有,然后有构造器,正常的话呢,一个类里边有什么它都可以有什么,那就是额外的它可以多这个抽样方法而已啊对于这个接口来讲的话呢,你把这个接口中的这个结构呢也说一说,比如JDK7及及以前只能有全局常量和我们的抽样方法,那JDK8以后的话呢,我们说可以添加静态方法和默认方法,就相当于呢,我们这个接口它可以已经写好一些现成的功能了,有方法体了,实际上这个时候呢,我们的接口就更像是一个抽象类了,对吧,它里边呢,因为它本身呢,可能还包含一些抽象方法,所以它已经特别像是一个抽象类了,嗯,就是其实呢,我们定义这个结构的话呢,也确实有这个这样的一个就是。
15:09
扎拉这个新标准八的这个标准其实就有这样的一个嫌疑,就是把这个接口呢,往这个类这块的功能上去导,尽可能的让我们这个功能呢实现一些扩展化,诶因为实现接口我们可以实现多个接口,你接口当中呢,还有一些默认方法此类呢,直接拿过来就能用了,诶而且我还可以对你进行重启,这不跟这个类这个意思就很像了吗?而且呢,JDK9当中又多了一个东西,九当中呢,后边我们讲的这个高级,后边我们去讲九十十一的一些新特性,九的新特性里边接口里边又可以说可以定一些私有的方法了,就是说我不对啊,暴露了,因为我们在这个接口中,八当中呢,说可以定一些默认方法,默认方法自己写,假设呢,你写了三个默认方法,结果发现,诶,这三个默认方法里边既然有一些重复性的代码了,是不是又想抽出来啊,一抽出来说这个代码呢,我只想内部用,那就private得了,越改越像类是吧?诶就这样个特点,所以它俩的天然的区别呢,可能还挺大的,就是类跟类之间是继承关系,单继承的接口跟类之间呢是实现关系,可以多实现,接口跟接口之间呢,是多继承,就是这个呢,你也表达一下说一说,然后后来呢,你会发现说我们这个接口呢,随着JDK的不断的迭代,我们看到一个趋势,就这个接口的话呢,我们再往这个类的方向去靠近,就尽可能的让我们这个功能呢,就是扩展性要强一些,看就这样一个点啊。
16:32
这个一会儿复习的时候呢,我们再把这个点呢,稍微再说一下,就是大家呢,这块呢,就不可能说一提说说不出来,这也不应该啊,就是正常我们在开发当中,抽样类和接口那都是要使用的,而且相对比较频繁的使用,在这呢,一提到他俩应该还是能谈一谈这个具体的内容的啊,下一个说如何创建静态成员内部类和非静态的成员内部类的对象,这个呢,还是需要大家能够写一写,其实呢,我们开发中用内部类呢,虽然比较少,这有时候笔试的时候吧,爱出这块相关的问题,比如说笔试的时候呢,就是给了你一个外部类,给了这个内部类,可能是静态的,也可能非静态,上面说呢,接着下边说呢,说以上代码当中,我创建这个类的对象的方式正确的是哪一个?
17:18
那相当于你得会这个创新,哎,这个简单咱们写一下,还有咱们昨天讲的说这个we部类呢叫person,内部的呢,我有一个静态的叫do,然后有一个非静态的叫bird,以这两个内部类为例,我们先造一下dog的对象,声明成person.dog这个应该很好理解了,Person dog本身呢不对外暴露,所以你得通过person这样声明点一下这个dog,然后后边。静态的直接new吧,person.dog后边就构造器了,你要有空餐的就调空餐,没有空餐的调食参,有参的那就调有参的,然后bird呢,是不是得先去new一个person啊,因为人家是非静态的了,只有有了外部类的对象,我们才会相当于你生成相应的内部类的这个结构了。
18:17
然后再接着我叫person.bird然后这一个bird等于P点还是牛p new new p点啊p.bird或者这个你写全一点是person.board也可以,这样就可以了,这个破点的话呢,也可以省略掉了,因为本身呢,你就是这个这个这个P里边了,是吧,这样去写,其实呢,也可以大家稍微去理解一下,这个咱们讲课的时候也说到了,你要说这个理解之余,你光理解了这个写的时候呢,没怎么去写,那肯定还是记不住,还是呢,得多去写两遍这个就可以了,像这呢,是咱们这五道问题啊,五道问题重心呢,肯定还是在咱们这个抽象和接口这块。
我来说两句