00:00
好,同学们大家早上好啊,今天的话我们聊第六道面试题,来谈一下这个接口跟抽象类啊,在开发中该怎么做选择呢?OK,来看一眼啊,这道题我们首先呢分两个层面来聊聊,第一个的话呢,是语法层面啊,那语法层面的话呢,咱们来看一眼啊,首先啊在JDK1.8之前注意抽象类的话呢,这个方法是可以有抽象的,也可以有非抽象的,注意有构造器啊,这道题的话呢,一般来说是在很基础性的一些面试的选择题上啊出现的,OK,所以要注意点,那接下来看一下接口啊,接口里面的话,它的方法都抽象的啊,这个大家没问题啊,然后的话呢,属性都是常量啊,默认的话呢,会有public static final修饰,也就是说什么意思呢?就算就算你写了一个接口,然后里面的常量没加任何的东西,就写了一个,大家看下像变量一样,但是默认它都会给你加上这么一个修饰,所以它就是常量,OK,好,那咱们接下来来看一下1.8之后呢,最关键的变化是什么呢?最关键的变化是这样,就是在接口里面,刚刚啊这个方法都是抽象。
01:00
上了是吧,但现在的话呢,在1.8之后啊,那么这个接口里面是可以有实现的方法的,这个方法是可以有实现的啊,那怎么办呢?非常简单,你看一眼,我给你写了一个代码,在这里头,我们只需要在这个方法前面啊,加上一个default就OK了啊那为什么这么设计呢?那实际上是这样的,我们在开发中的话,有时候遇到这么一种需求,注意看啊,给家举个例子,假设啊,假设这个呢,依然是咱们之前的,比如说这边有个接口啊,我在就这么一个接口,呃,我就写简单写一下吧,比如说叫I use的service,那假设呢,在这里面的话呢,它可能有很多的方法呀,但是他有些以前的话呢,它的方法都是空的嘛,是吧,都是空的一些方法,还有很多的方法好看一眼啊。假设很多,然后接下来的话呢,我有一个子,一个实现类啊,一个实现类,这个实现类的话要去实现这个东西,但是呢,假设在某种场景下的话,它可能只需要关注去实现某一个方法。懂我意思吧,那这个时候的话呢,它前两个方法他不关注,那这怎么办呢?有两种两条路可走,第一条路就是这个类本身变成一个抽象类,那它就只可以他就可以只现一个方法,另外两个依然依然保持抽象的完事了,对不对?但如果说这个类他不想做抽象类,他想做一个可以被实现,一个可以被实例化类,那怎么办呢?这个时候没办法,语法上的要求他必须干嘛,他必须把这个A方法给重实现了,哪怕是个空实验都可以,所以就变成这个样子了,然后呢,再去写它的B这个方法,那这个方法的话呢,他写具体的实现在这里面的话,就可能比如说啊,噼里啪啦写了很多代码,对吧?啊OK,好,然后的话呢,C它呢也是没有想实现的,所以它也是留了一个空实现,所以就看到这样的代码,就是什么呢?就是看到它里面有很多空实现,只有一个写了实现意味着什么呢?其实实际上来说这个这个类的里面代码的有效代码其实只有这这一部分,只有这一部分是吧,只有这一部分。
02:56
那其他都是废代码啊,都是没有用的代码啊,所以一般来说呢,你会看到有些地方的话,别人还会再写上一个中间层的代码,里面干什么,干什么事呢,这个类呢,就干一件事,就是把这些东西啊统统拿过来,全部给他写好空实线,然后的话呢,你来继承我就完事了啊,你就写你想实现的那个东西就行,因为空实线我都干了啊,OK,所以你发现了这个活呢,就有人写了这么一个东西,这些东西这种写法,咱们在看到框架里面的东西的话呢,非常常见啊,OK。
03:26
好,但这个玩法啊,在1.8之后就变了,1.8之后啊,那么就变了,变什么样呢?这个时候变成这样,就是我再也不用这个东西了。为啥?因为我接口就可以自己写很多空视线了,诶你看这个烦恼是不是解决掉了,哎,就没有这个东西了,我这边也不用再写这些东西了,干掉干掉啊,代码的简洁性有效性就更高了啊好,这块是基于他这么一个设计,这个是我自己的考虑啊,那么他这个作者当时在想这个东西的时候啊,他们是不是这么想的,这个我不知道,OK,好,那好了,咱们接着往下聊啊。
04:03
那接下来再来看一下在这个开发的设计层面啊,那这块东西的话怎么去用呢?很简单啊,首先的话呢,抽象类,注意抽象类啊,它就是对同一类事物的抽取,说白了是干嘛呢?关键的核心点是什么?核心点是它一般来说我们了抽象类是因为它要提供一些什么呢?提供一些公共的实现啊,公共的实现还有那一些可能是一些什么,一些固定的一些语法东西,固定的套路啊套路,比如说像我们在那个之前讲过那个什么模板设计模式。那么他这个时候的话,它可以在抽象类上面,上面这个副类上去,需要一个抽象的方法啊,然后由此类去实现啊,OK,就留下口子啊,留下些口子,OK,然后的话呢,在这边的话提供一些公共实现,举个例子吧,你看啊,比如说。像我们分层开发是吧,那第二层里面的话呢,咱们咱们之前说过啊,它这个东西就是对数据库的操作嘛,对不对,那对数据库的操作呢,无外乎就是什么增删改查,所以这个时候的话,我们可以通过去写像best store service啊,Best store m PL,那在这一块里面就可以写好各种资量改查,那他的子类就受益了嘛,啊父辈都把活干了,子类就不用干这个活了,就可以干其他具体的活了啊衣食住行全利搞定了,是不是,那剩下干别的事情啊。
05:21
追求你理想去啊,OK,好,就是这样的一个事啊,好,然后呢,这里面的,比如说在业务层啊,业务层我们也可以写成base service m p啊,OK等等,好这些就是我们抽象类的一个价值啊,那好,接下来再说到接口啊,接口是什么价值呢?接口接口啊接口你可以认为它更多是一种标准规范。就是我们两个系统对接的时候种标准规范啊,约定好了就这么干啊,我又这么调,你至于里面怎么实现的啊,到时候可能可以换个实现,但接口必须是这么一个接口是吧?你可以联想一下,就像我们现在手机啊是吧,我们现在买的手机可能有苹果的啊,可能有安卓的对吧?那充电的话我们一般都会干嘛,就会对那接口,只要那个接口对得上了,我们拿来一个充电器,只要接口是对的就能充电是吧?所以接口就是一种什么一种规范啊,一种规范约定的这个能否充电啊,这个关键点。
06:13
好,那好了啊,那咱们接下来再来看一下往下走啊,那这里头的话呢,咱们再说一下项目里面的,比如说像单体项目是吧,我们基本上来说会做分层的开发啊,那这个时候的分层的开发,比如说有控制层,有业务层啊,有这个数据防问层对吧?那这个时候的话呢,我们这个接口就会作为各层交互的纽带啊举个例子,我们在控制层啊,需要注入这个业务层对不对啊,这个时候的话呢,很简单,我们不会注入具体的实现,因为叫个耦,耦合在一起了以后换换别的实现换不了了,诶只能用这个,就好比什么呢?好比你说我这个买了一个小米,它只能用小米的充电器,你换个别的充电器不行,你看这个时候很麻烦的,对吧,那现在都不这么干对不对,你看现在我只要接口匹配,我就用谁的充电器都可以,用华为的可以没问题,对不对,只要接口匹配就行,所以的话呢,这里面的话呢,我们注入这个东西啊,注这个东西要注入什么,注入这个接口,那具体的话呢,我们在实际运行期间的话呢,它给你。
07:13
入一个具体的实现,OK,同理啊,在业务层注入do也是一个道理啊,所以这个是作为分层开发里面的一种规范啊。好那么下面的话,比如说像我们现在比较火的微服务分布式项目,好这一块呢,如果你之前没有接触过微服务分布式的项目的话呢,你听起来可能一知半解啊,没关系,如果你想了解的话呢,也可以去看我免费的这个微服务的系列课,OK,好那么这里面我再简单提一下,咱们看一眼,比如像微服务开发里面的话呢,我们可能要抽取一些公共的服务出来。然后的话,这个时候就会有对方就调这个服务,那调这个服务的人呢,就一般来说啊,假如说假如举个例子啊,这个是个什么,这个是个短信服务是吧?举个例子啊,这是个短信服务,然后呢,它是个基础性服务是吧?然后的话呢,我们这个的话呢,是一个,呃,我们这个是什么,这个是一个订单啊,订单服务,订单服务可能在用户下单成功之后呢,需要调短信服务,给用户发个发个信息对不对,那这里面的话,一般这就称为这个服务的这个消费者,服务的消费者啊,这个呢,提供短信服务的话呢,在这微服务里面,它有服务的消费提供者啊服务的。
08:21
提佣者或者生产者都可以啊,好,然后呢,这个时候的话,他俩怎么调呢?一般来说也是要中间抽取一个约定俗成的接口来对接的,谁来面向接口来实现啊,OK,好,也是这么一个玩法啊好,所以的话依然来说都是接口啊,所以这就是我们作为接口的一个设计规范规范啊,然后呢,抽象类你可认为就是实现啊,实现约定,OK,好好了啊,那这样的话就抽学公共的实现,就是他俩的关注的一个重点的差异啊,公共的实现还有一些什么抽象类啊,简单来说抽象类关注的是什么?公共的实现接口关注的是规范标准啊。
09:01
好了,就说这么多,如果说对你有帮助,麻烦大家点个赞啊,咱们下节课的话呢,再来啊好,今天呢,这道题我们就谈到这儿。
我来说两句