00:00
那接着的话呢,咱们看一个关键字啊,这个关键字呢,叫做interface,哎,从我们讲的这个三条主线的角度来说的话呢,这呢属于第三条主线啊,叫做interface关键字的使用。啊,那从另外一个角度来说的话呢,它是跟类呢并列的一个结构啊,那这样讲的话呢,它的地位呢,一下子就提升了,呃,我们可以看一下这个API啊。哎,过来。在API这块的话呢,诶,我们比如说就看一下这个浪包下的啊,先点下这个贝斯。嗯,这些结构里边呢,我们再来看一下这个浪毛浪堡里边的话呢,诶往下走啊,相对应的啊,你看这块呢,是一些类啊,这叫类和接口了,就看这了啊,它这个不同的版本呢,它这个格局不太一样了,看这儿这个呢叫interfaces啊,这呢就是相应的一些这种接口,然后这块呢叫classes,就相对应些一些类。哎,所以可见的话呢,就是这个接口和类呢,你会发现呢,它是并列的这个结构。啊没问题啊,包括呢,我们通过这块啊,右键的方式去new的话呢,你看这叫class,这呢就是创建类,下边的呢,就是在创建接口。
01:05
OK啊好,那这个接口到底是一个什么样的结构啊,说跟类呢,去并列的是吧,前面我们讲的面向对象的特征啊,说类里边都能声明什么呀,其实都是类的,这个体系跟接口呢没关系,那下边呢,我们先了解一下这个接口到底是一个啊,何方神圣是吧?好,这个接口呢,用interface啊这个关键字呢去修饰,就好比是类用class来修饰是一样的,诶首先呢,要想理解接口,我们先啊跟生活中的一个例子呢做一个类比。生活当中呢,我们通常提到这个USB啊,通常呢,就会说USB接口。是吧,哎,那其实这块呢,就提到了接口这个词,那么这个USB接口跟我们现在讲的这个接口是不是一个概念呢。呃,其实呢,还真可以理解成就是一个概念。啊,怎么看啊,生活当中大家每天都在用这个USB接口来跟我们这个接口的特点是什么呢?首先看USB啊,它呢叫通用串行总线。
02:01
啊,这个你就USB这样念,你别念成U逗号B啊,就跟骂人似的了啊。那那他呢怎么着呢,在电脑上的话呢,我们有一个啊,或者有多个啊USB的这个接口,然后呢,我们就可以跟很多的这个外部设备啊进行连接了。啊,连接上以后的话呢,跟电脑呢,就可以进行这种数据的传输了。这呢,就是我们所谓的叫USB接口啊,你会发现呢,全世界的USB接口的这个标准呢,都是一样的。啊,比如说你里边呢,有几个这个金属点啊,这个尺寸是什么样的的呀,全都是一样的,所以呢,我们都可以呢,去做这个连接。啊,那么这呢,其实就涉及到了一个uip的一个规范的问题。啊,具体的啊,不管是英特尔也好,或者他又给了哪个组织好,这个组织的话呢,就来负责制定啊USB的这个规范,这个规范呢,咱们作为普通人能够看到的就是一个长啊,宽啊,或者你里边有几个金属点啊,是吧,进行数据传输的,这呢都是面上你能看到的,那没有看到呢,其实里呢,就会涉及到很多功能的一些规范。
03:04
然后要求你这个所有的外部设备啊,都应该具备相关的一些功能,比如说你这个,呃呃,一连接上这个电脑以后呢,能够进行比如说这个吧,呃,这个电脑是吧,对外呢,开放了USB了,诶连接上它以后呢,这个呢,首先比如说有提示啊,可以进行数据传输了,哎,包括呢,所有的外部设备呢,我们最后不用的时候呢,都这块有对应的这种。诶这块我这没有外部设备了啊,就是你可以呢去给他再呃这个弹出是吧,哎,包括呢,这个传输的时候呢,都会有相应的一些方法的支持。啊,像这些的话呢,其实都是一些对应的规范,这个规范呢,在USB这个规范里边呢,它就定义好了,要求呢,你这些外部设备呢,其实都得去实现。啊,那其实这里边儿呢,提到这个USB接口,就是我们现在要讲的这样的一种啊,这个接口的概念了。啊,其实呢是类似的啊好,那我们这块来看一看,咱们Java当中这个接口是什么意思啊。哎,回头让大家你比对一下你就知道,哎,其实确实差不多啊,所以呢,我们Java里边讲的这个接口啊,其实也是一种规范定义的呢,是一组规则。
04:07
体现的呢,是现实世界当中,如果你是啊,要怎么着,就必须得能怎么着,这样一个思想和继承呢,是一个是不是的关系啊意思的关系,而接口呢,它实现的是能不能的关系,就是亥字A的关系。啊,你比如说这呢是个电脑啊,这呢是一个相机打印机,或者是这个U盘了哈,所以呢,你现在呢,想跟电脑呢,进行数据库的传输啊,进行数据的传输了,说呢,你现在是有没有。啊,你要是想进行数据传输了,你能不能有这样的一个规范,这样一个标准的去遵循呢?好,如果你遵循了这样的标准了,那我就让你呢跟电脑进行数据传输,你要没有遵循这个标准,我就不让你进行数据的传输。所以这个标准的话呢,我们就体现为Java层面的一个接口,所以我们就可以定义一个接口,假设呢,就叫USB。然后呢,要求呢,我们这几个设备啊。都得遵循这个规范,这个遵循怎么体现呢?注意不是继承了。
05:04
你不能说这个打印机的副类呢,是一个USB是吧。怪怪的啊哎,那这时候就涉及到类和这个USB接口之间的关系,我们称为呢叫实线关系。哎,叫一种实现关系啊,那一旦实现了这个接口呢,它就具备了这个规范里边定义的这样的一些功能。啊就可以了,好,我再举一个例子啊,我们看下边的例子。比如说呢,叫篮球运动员,足球运动员啊,大学生小学生啊,这个篮球也好,足球也好,这个运动员呢,他们呢,继承于叫运动员的类。这个学生这块呢,继承人叫学生类,这个是我们现有的这种继承关系啊,说现在呢,有一个叫学英语这样的一个接口,这个接口呢,它就封装了一定的功能,或者这个接口呢,就定义了学英语的一些规范了。那我们就可以呢,比如说让那个足球运动员啊,这个大学生啊,不管呢是谁,如果呢,你们是想学英语是吧?呃,想遵循这样的一个接口的规范,你呢,就实现这个接口就可以了。
06:03
啊,这是我们用的这个关系呢,叫实现,诶实现以后呢,这个足球运动员和这个大学生他们呢,就哎能够去学英语了。哎,这个父类呢,该是谁还是谁不受影响?啊,我们比如说再举一个这个场景的例子。啊,这个也好,或者我们看这个也行啊,说呢这个飞机也好,子弹也好,风筝也好,热气油也好啊,诶这块呢,都是不同场景的这种具体的类了,这呢我们只考虑实现的关系,说呢现在呢有一个接口,它表示的就是可以飞这样的功能。啊,或者叫规范,我们定义到这个接口里了,然后呢,你发现呢,飞机也好,子弹也好,风程也好,热气球诶,他们都可以飞。那我就可以让他们呢去实现这个。啊,或者换句话说呢,哎,当你实现这个结束以后呢,体现为呢,就是你们可以飞了。然后这呢,还有一个接口呢,我们叫诶攻击性。你看这块呢,其实你看都不是名词了啊,我们以前讲副类的话呢,其实都是一个具体的载体,是一个名词啊,现在都是一种功能的封装啊,哎,攻击性。
07:05
对,有攻击性这块呢,我们就把它呢封装到一个接口里了,然后呢,你像这个子弹啊,像呃就就子弹是吧,哎,它具备这个攻击性,飞机也有攻击性是吧。不是正正常点飞机是吧,嗯,客机哈。科技也有啊,那911了是吧,这个就就别想那个了哈,这个子弹的话呢,具备攻击性,那我就让那个子弹呢,也实现这个接口,呃,实现这个接口以后呢,诶,它就具备了这样的一个功能。诶,所以从这个角度来讲呢,这个实验接口跟我们继承的这个复类啊,它确实是,诶我们不同的这种场景啊。啊,这个大家关注一下啊,这是一个事儿,好呢,我们再接着拉回来,刚才提到了说这样的一个规范的问题啊,只要呢,你实现了这个规范了,你就具备这个规范里边定义的一些相关的功能。啊,那么关于规范这个事儿呢,我们再唠叨两句哈,诶怎么体现叫规范呢?刚才我们这也说了啊,USB呢,是定义了跟电脑通信的一种规范了,谁呢,实现这个规范,谁就能够跟电脑进行数据传输,那我这块呢,又举了个例子。
08:06
这个例子的话呢,是我们在讲完这个扎瓦记录以后呢,大家可以学的一门技术呢,叫做JDBC。哎,什么叫GDBC呢,就是它呢,实际上是一波API。啊,说白了就是一些类库了,这个类库里边呢,主要的就是接口。哎,主要的是这个接口啊,那这个接口是干什么用的呢?它就是规范了,我们用Java程序操作不同的数据库的这样的一组规范。诶以前的话呢,比如我们要没有JDBC,你直接呢,用Java程序呢,去操作这个具体的数据库呢就可以了,但是这样写程序的话呢,呃,会不具备通用性,因为呢,像MYQL跟Oracle呢,这个是不同的数据库了,可能这个细节啊差别很大,你用Java程序呢,连着MYSQL,你再拿着这个代码呢,如果去连Oracle肯定不好使。所以呢,重新呢,再去重新写一套代码去,连Oracle,包括这个DB two也同样的道理。呃,显然呢,就感觉一致性很差,怎么办呢,这个散公司出面。
09:00
啊,这个我还用上公司来说啊,要不你说Oracle跟那个就。整混了是吧。呃,Oracle现在很强大啊,他把这个麦斯库也给收购了,Oracle是他家的,Java也是他家的是吧,这个咱们还用原来的词儿啊,叫sun公司,好,这个萨公司呢,是Java的这个母公司了哈,他出面。说呢我订一套标准啊,这套标准呢,就是有好多的接口。那么这套标准呢,合在一起呢,就叫做GDBC呢,对于Java程序员来讲呢,哎,你不要呢去面向具体的数据库去编程了,你只面向我这套接口编程就行。哎,就是呃,需要呢,具备什么样的功能,我这都定义好了,直接呢,你去实现我这个接口,实现完以后的话呢,诶然后接下来诶这个接口呢,我们再去提供下边这个实现类,诶他呢去操作数据库。因为呢,你是面向接口编程的,它呢封装了不同数据库厂商的这个细节了。诶使得呢,就是你这个代码如果是操作的myle啊,操作的比如Oracle,那后期呢,你想改成my circlele了,其实呢,这块呢非常简单,因为呢,不同的数据库厂商呢,都呃针对这套接口这个标准呢,它进行了相关的一些改造是吧,都满足这套标准了,然后呢,你在呃连接MYSQ的时候呢,这个代码其实变动很小,直接呢就可以来操作MYSQL。
10:10
使得我们这个代码呢具具备很好的一致性。啊,那这呢,就是我们体现了这个接口它的一个作用,它呢就是一套规范。啊,就是这个概念啊,好,那么简单的话呢,我们来理解了一下这个接口这样个事儿,那下面呢,回到这个代码层面呢,我们来看一看啊。好,这块呢,就是关于接口的一个使用,呃,首先呢,关于接口的一个理解,刚才呢,其实我们就在讲这个问题啊,这块有这样的一句话,哎,我们粘过来。哎,说接口的本质呢,就是一个契约,是一个标准,是一种规范,就像我们的法律一样,制定好以后呢,大家都需要遵守。再回过去啊,就像这个我制定制定了这个GDBC这样一套规范了,里边主要是接口,大家呢,都遵循这套接口和规范,那我们再去编程的时候呢,这个代码就具备一致性。啊,规范性啊,USB也同样道理,全世界范围内USB的标准全是一样的,大家都去遵守,那这块呢,你随便呢,你去欧洲买一个USB的一个设备,插到你这个电脑上照样也能用啊,因为呢,大家的这个标准都是一样的。
11:12
具体这个细节呢,大家理解可能还不是很好,那因为呢,我们还没有讲这个代码,下边呢,我们来看看这个代码层面的这个场景啊好,那接口呢,我们应该用什么去定义呢?诶刚才提到了。Interface。就好比类呢用来定义一样啊。好,那么这个interface呢,去定义一个接口里边呢,可以声明什么样的结构呢,这块我们要明确说一下。在结构里边呢,我们可以呢,去声明属性。这个属性的话呢,比较特别,必须呢使用叫public static final来修饰。啊,可以声明啊属性。哎,属性啊,这呢,我们说必须使用。Public。呃,Static final修饰,那大家呢,也能看到这个属性呢,我们称为呢叫全局敞量是吧。
12:05
哎,就是不能改的。啊OK啊哎,就只能够声明全局常量,不能够声明这种变量的啊啊这呢是声明属性那方法呢。方法这块的话呢,我们就得说的细一点了,哎,这块呢怎么来讲呢,方法的话呢,首先我们看下叫JDK8之前。哎,之前的时候呢,这个方法呢,我们说呢,只能声明。叫抽象方法啊。修饰为哎,叫public abstract。也就是说呢,在GD8之前呢,我们接口里边如果要是有方法,方法呢,全都是抽象方法。你看抽象方法呢,是不是才是像一种规范一样啊?具体怎么去做呢,是不是他没有说呀。哎,就像咱们国家,比如说。出国了,跟俄罗斯的啊,或者跟谁也好,就是谈合作,你看发现了他们聊的呢,是不是都是说的那些话啊,都是极其的这个抽象是吧。
13:02
啊怎么讲呢,那么我们要加强啊,比如说跟欧洲啊,我们要加强跟欧洲之间的合作,我们要呢,是不是,呃鼓励呢,就是叫什么。你这个贸易这个全球化是吧,诶说完了,呃,这句话大家会觉得说的跟没说一样。有点像呢,就是他说的就像这种抽象方法一样,他说完之后呢,下边各个部的部长啊,各个公司这个CEO啊,是不是就开始落实了,说咱们得合作呀,咱们得怎么着啊,是吧,来落实这个领导人的精神呢,这不就相当于这种标准,这种抽象方法的一些具体的实现了吗?诶,什么叫规范标准呢?就是他只提一些大方向啊,所以接口就这样,那我只提供一些抽象的功能。具体实现呢,看你下边这个时间类的事儿了啊。这呢是我们G8之前的这种场景,然后呢,在这个G8的时候呢,出现了这个特别的这个新特性了个新特性呢,我们说呢,就可以呢,去明。哎,这个我们叫静态方法和默认方法。啊,这个事儿的话呢,咱们最后的时候呢再讲。
14:03
我们先往这儿放一下啊,然后呢,这是JD8,然后GD9的时候呢,又多了一个呢,说可以呢,去声明叫私有方法。那就这样个场景,诶这块呢,咱们暂且呢,大家先不关注,主要呢先关注这两个。因为咱们自己呢,在程序当中去定义接口的时候,虽然说咱们现在都用的G17了啊,咱们一般呢,也都是只定义这样两种东西。啊,对于JDK的源码来讲呢,它会体现下边这样一些场景啊,我们其实用的还是比较少的啊。好,那么既然这样说了啊,那这块呢,我们就可以再去定义啊,但是呢,我们定义之前呢,稍微的再多说两句哈,在这个接口里边呢,能声明的是这样的东西,那不能声明呢?诶那很明显的,首先呢,不能有这个构造器哈。也就是说呢,接口他呢,也不能够造对象。跟抽象类一样。但是呢,他不能找对象的原因呢,是根本就没这功能。构造器都没有是吧,诶它不能够生命构造器,包括呢,我们说的这个,呃,这个代码块是吧,等这个呢,都不能有啊。
15:06
好了,这个说的已经非常明显了,然后回过来这块我们可以呢,诶去考虑一下接口这块的一个体现了,啊不妨呢,我就叫做interface的一个测试。这呢是个类啊,然后下边的话呢,咱们去写具体的这个接口和它的这种实现类了,刚才那块我们举过一组例子。这组例子啊,不妨这块呢,我们就拿这块里边来挑几个类呢,我们来说明。首先这块呢,提到一个叫可以飞,哎可以飞呢,我们就定义成是一个接口了。啊,这个接口里边,比如我们就叫做flyable是吧。哎,这注意这是个接口啊。好,那么这接口里边呢,我们考虑呢,说诶可以定义呢,这个叫全局常量啊。这个修饰符呢,就是public了,哎,Static是个final的,比如我们定一个叫哎型的,咱叫mean speed。
16:00
呃,最低的速度啊,能能飞行的最低速度,那就是零吧。哎,除了最低速度呢,我们再定一个,比如说呃,最高速度。Public static final。呃,In类型的叫max的一个的。在这个地球上啊,你这个飞的最高速度呢,不能超过第一宇宙速度是吧。哎,7.9公里每秒是吧。那这个我就写个七千九吧。好,这个我就定义好了啊,这个呢,就是我们定义的这种全局常量,有同学说呢,你看必须要生明成,这个我把它删了。删了是不是就不是全局常量了呢?诶不好意思,删了以后呢,默认也有。就你看我这块没加是吧,没加这块呢,也有这个声明证明很简单,你看没方法进来。啊,我首先呢,拿我这个接口,咱先看看这个调用吧,因为它是static的,跟类一样啊,是不是直接能够拿这个。来。
17:00
所以我就可以呢,调这个叫mean啊是吧。诶打印一下,诶你看我下边这个呢,我把这个死在这个我给删了都哈,删了以后呢,它也是静态的。啊,第二你看这个max呢,这不也可以去调吗。啊,因为呢,能够拿整个这个接口来调,所以说这其实也是静态的啊。翻种的体现的话呢,那很简单,我只需要呢,试着去改一下它的值不就知道了吗?比如改成七千八了,搞错了是吧,哎,原因呢,说你不能够再去分配一个final的一个变量了。那不就说明它还是一个常量吗?哎,所以这块呢,大家理解呢,就是说哎,我这块呢,声明成是个全局的了,你不写呢,也有它也就是说呢,你可以省略。给我写到这儿啊,说呢可以省略这个事儿。啊,这个呢,其实你也可以理解成是一种推断啊,因为它所有的这个属性呢,都是这样的声明,那你不写呢,其实也是有的。啊,所以大家呢,平时写的话呢,可以考虑就省略掉了啊。
18:03
这呢你也不能改,这呢是关于我们说的这个属性的问题啊,接着呢,我们来说这个方法。哎,方法这块呢,我们就先考虑JDK发之前的场景,那你只能是写这个抽象方法。啊,那就意味着我们是public abstract。啊,比如说word啊,是一个FLY的方法,就这样写。啊,这没问题的,那由于呢,这个抽象方法的话呢,都是有这样的声明的。所以呢,也可以省略。啊,这个我把它拿走了,这个方法呢,我们说呢,就是可以。哎,省略啊,这样的一个声明。哎,所以这块呢,哎,你看到长这样,所以这怎么没有方法体呢,也没写abstract的呀,注意他已经省略了abstract。哎,所以这样呢,也是可以的啊,哎,比如说咱们再换一个这个,比如说叫具备这个攻击性是吧,诶class呢,这个叫attackable。啊,这呢也是一个接口。
19:01
Class了。Interface。他啊。好,这个接口的话呢,比如说他这块呢,有一个方法呢,叫attack啊,比如我们这个呢,写全了,你就这样哎,Public abstract。Attack。哎,这样去写啊,这个呢,你把前面这个加个word啊。这个呢,你把前面的这个呢,删掉呢,其实也是没有问题的。啊,这就我们说呢,就是可以省略这样的问题了,好,咱们先不接触啊,GT8及之后的这个事儿,到后边这个位置啊,咱们专门呢去讲一下GT8的这个问题了啊好,暂且呢,我们先把这两个事呢,先多去做一个强化啊。好,这就完事了,这个完了以后的话呢,我们接着来看说呢,接口跟这个类是什么关系呢,这个我们说呢,叫做实线关系。好,现在的话呢,我们去提供这个具体接口的这个实现类这样的一个接口,这一个接口啊,下边我们这块呢,来一个class。刚才这块给他删了啊,再重新来一下。
20:02
啊,往这一放啊,比如这块呢,我们有一个这个叫呃飞机啊,这个叫plan啊。哎,他让他呢,我们去implement一下。啊,这个呢,比如说叫able。啊,就这样就可以了,诶这就相当于我们让这个类呢去实现了这个接口。那实验接口的话呢,接口里边生命的属性方法你也就拿过来了。那目前呢,报错是因为。方法的事儿是吧。对啊,这个方法呢,是一个抽象方法了,那这块呢,你就包含了一个抽象方法,两方面处理,要么呢。你写成是个抽象类是吧。哎,Abstract一下。那这样的话呢,就不报错了,那要么的话呢。哎,你就把这个抽象方法呢给实现一下。比如我们这个叫子弹是吧,诶class。是让他呢,Implement一下,这个叫able。啊,比如说以他为例啊,这块呢,我们alt回车啊,这个你把这个,哎,这个方法是不是就OK一下就在这儿了啊。
21:04
让子弹。飞一会儿是吧。哎,这样就可以了,好,那你把这个抽象方法呢给实现了啊,那相对呢,你就可以实例化了。那你如果要是实现了两个接口啊,这块我们再来一个逗号啊,叫attackable是吧,那自然而然的,你这块呢,就有两个质管方法了,诶只重写一个还不行,还得把另外一个也重写啊,再al enter一下。哎,然后这块我们再把这个attackable呢,再重写一下。啊,子弹。啊,可以。这个击穿是吧。嗯,身体吧。啊,这个呢,就就被这个袭击性啊好,那这样的话呢,你这个呃类呢就可以实例化了啊能实力化呢,其实后边这个操作呢,跟咱们以前讲的就都一样了,呃,你可以呢去创建啊具体那个子弹的这样的一个对象了。哎,创建完以后呢,通过它呢,我们可以呢,调这个所谓的flag方法是吧?诶通过它呢,再去调我们这个叫attack的方法啊,这都没有问题啊来我们做一个run。
22:05
哎,这都是可以的。啊,这块跟原来就都一样了,好回过来这块说明一下啊,刚才这个接口跟类呢,注意是一种实现关系,哎具体的格式的话呢,这样来写啊说class,这我写个A,哎让他呢去implement一下,哎这呢是我们这个接口,比如接口这个叫B。啊,然后呢,诶大家会发现呢,我刚才在这个起的时候呢,说这个子弹呢,说可以飞,它还可以具备攻击性,我就实现了两个接口。哎,那这块呢,我们就提到了,说这个实现关系啊,其实对应的点呢,叫可以多实现是吧。哎,所以这块我们还可以呢,再写个C啊这样的场景啊,那这个写完以后的话呢,我们再说一下啊,这呢我们只有实现没有继承,如果呢,要把继承也加上呢,我们习惯上呢,就是先来写这个继承。啊,比如说继承鱼啊,这个我们叫,比如说叫super吧。啊,然后呢,你再去实现后边这个接口。啊,这样子的啊好,这个格式写完以后的话呢,诶我们可以呢,去做一个说明啊,说明这块呢,这样子啊说这个A。
23:08
诶,相较于咱们这个叫super a来讲。这个呢,我们把A呢称为呢叫子类。A,相较于是来讲啊,叫做子类啊。啊,而这个A呢,相较于。相较于啊,咱们这个B和这个C来讲。哎,我们把它呢叫做。实践类。诶叫做这个实现类,因为呢,它把这里边这个抽象方法呢,都会做一些实现吧,哎,所以我们称为它叫实现类了啊好,那么满足这种关系以后的这个对应的说明呢,哎这块我们说一下,首先呢,我们说这个呃类呢可以实现。多个接口。啊,那自然而然的你就实现了一个功能的一个扩充了。从这个角度上来讲的话呢,前面我们说过啊,说这个类呢,在继承方面呢,是单继承性的。
24:00
那么多实现的这样关系的出现呢?一定程度上就弥补了单继承的这种局限性。啊,这说一下啊,啊说类呢,类的这种啊类针对于啊这个接口的这个多实现。啊,一定程度上。啊,一定程度上。哎,就哎弥补了啊这个类的。单继承的啊,局限性。啊,因为呢,这个接口里边呢,我们其实也有相关的一些功能,然后呢,我通过实现的方式呢,就把这个功能呢,就也拿到了。虽然呢,大家可能会说,诶这功能都是抽象方法,抽象方法也是方法呀。是或者换句话说,抽象方法呢,也是一个功能,只不过呢,没有具体实现而已啊,你实现它了啊,你implement它了,那这个功能其实也是拿到了。啊,这个大家要注意哈,呃,另外一个角度来讲,我们这个八的时候呢,在接口里边就可以有这种默认方法,这个默认方法是有方法体的。
25:02
啊,你把这个呃,实验内呢,呃一实现这个接口,你把这个有方法体的方法,这就拿到了,实际上呢,这块功能也进行了一个扩展。所以呢,一定程度上就弥补了这个局限性。哎,这个大家呢,去注意一下啊。好,这呢就是我们说的主要的这个场景,那这里边呢,有一个具体的点呢,我们刚才也提到了哈,说呢这个类呢,如果你要是实现了这个接口,不管你是一个还是多个哈,必须呢要啊把接口中的所有的出氧方法呢都得去。呃,其实呢,就要实现一下,或者你要重写一下是吧,这样呢你才能够实例化,否则的话呢,你也是一个抽象类啊。啊,这说一下说这个类呢,必须啊将。实现的啊,接口中的。哎,所有的。哎,抽象方法。哎都哎重写是吧,这个呢,或者我也叫他实现了,哎那么方可。哎,实例化,哎,否则此实现类。
26:01
啊,必须。哎,声明为抽象类是吧。这个类呢,必须将实验的结果中的所有抽样方法都进行重写,这样呢,你才能够是一个正常的类,你才能造对象啊,否则的话呢,你要是没有重写所有的抽样方法,那你里边就包含抽样方法,那你就也是个抽样类,那就不能实例化了。哎,这个细节点呢,大家要注意一下啊。好,那么这块呢,其实咱们就把这个核心的这个问题呢,就也呃说的这个差不多了。好,这是我们关于类和接口之间的这样的一个关系。好,那么这个呢,我们就说清楚了,说清楚以后呢,接着我们再看下个问题哈。嗯,类跟类之间,类与接口之间关系说完了,那么接口跟接口之间呢,也满足一种关系,这种关系呢,也称为继承关系。所以说呢,接口跟接口之间呢,既然可以是去继承的哈,而且呢。可以多继承。哎,对的啊,有这样的一个特征啊,这块的话呢,咱们就简单的这块做一个这个测试就行啊。
27:03
哎,这个我们来测试接口的。啊,继承关系啊,这呢,我就诶写一组相对来说比较抽象的了啊所呢这是一个接口,比如这块就写一个叫METHOD1。这是一个抽样方法了,好,接着我们在interface来一个BB。啊,这个呢,我们来word啊,我加一个METHOD2。哎,这呢也是一个抽象方法啊好,然后接着的话呢,我们再来个interface,来个CC,让它呢去继承于你看AA逗号BBA。就可以了。哎,通过这儿来看的话呢,首先这是一种继承关系,其的话呢,是可以多继承的。啊,接口可以多啊集成好,那么自然而然的话呢,我们当前这个CC里边呢,是不是应该有两个方法。哎,那就意味着啊,如果我们现在呢是class class一下这个叫DD,让他呢去implement一下这个CC。啊,那么这呢,里边是不是就算是有俩方法了。
28:00
啊,那这块呢,我们要想呢,能够实例化al enter一下啊,一回车是不是得把这两个都得实现一下。哎,所以OK,那就得这么着才行。啊,这块呢,主要呢,大家关注的就是这个场景啊。呃,也就是说呢,我们在呃实际开发当中,我们定义接口它是个规范,这也是个规范,然后呢,我们现在诶再让这个具体的类实现这个规范的时候呢,我们想让它实现另外一个接口,这个接口的话呢,诶我就把一些规范呢做了一个继承。然后呢,这里边儿这个规范呢,就它里边的,它里边的就都有了,然后我们再让这个呢,去继承一个,呃,这样的一个子接口啊。相较于a ABB来讲,CC叫做子接口。那就可以了,他去实现它。啊以后呢,我们在集合当中啊,会看到这样的场景,比如说这儿呢,是这个collection接口,然后这个呢就是啊这个呢,就是具体的比如list接口,然后呢,我们让这个呃,具体的a list去实现了list接口啊,List接口再去实现这个collection接口啊,会有这样的这种层次关系啊,啊以后呢,我们会看到这样的场景的。
29:03
好在这儿的话呢,我们就把这个事儿呢,就说清楚了啊。好,那下边这块呢,提到一个叫接口的多态性。哎,现在回忆这个多态性是什么意思啊?哎,相当于呢,就是我们前面讲的是类的多态性的体现,说声明呢这块呢,相当于是一个负类。真的是一个叫呃变量名吧。诶,然后呢,右边这块呢,我们拗的是一个叫子类对象吧。这个是我们前面讲的这个类的多态性啊。说现在叫接口的多态性。怎么理解呢?哎,把这个位置呢,负类改掉。对,这个呢,我们叫做接口名。啊,然后这个呢,还叫变量名,然后这个你有一个。注意此接口是叫子接口吗?对,不能叫磁接口了啊,因为呢,接口本身就没有构造气啊。不能造对象嘛,那你这块new呢,肯定是要造对象了是吧?哎,那你只能是叫new对实现类的对象了。
30:07
哎,这呢就是叫做接口的多态的形式,回过来其实呢,就在上面这块啊,非常的简单啊。这块你看我们用了一个这个叫子弹是吧。哎,我还是你一个子弹。但是这块呢,我把它付给谁了呢?你子弹的这个类,哎,不是类实现了接口了,是不是叫Fla或者是a table是吧。哎,我要是用接收,那你这块呢,就是。这样一下。那叫F1吧。这样就行。这时候F1的话呢,它只能是调FLY的方法了。啊,你要是让他用ta接收那呢,能调的是那个attack的方法。哎,这呢,这不就是接口的多态性吗。哎,那么这个多态性呢,跟我们类这块其实有点类似哈,说声明呢,是一个接口类型,实际上你用的是一个实现类的对象,然后呢,当我们去编写代码的时候,或者编译的时候呢,我这块按住CTRL键啊FLY是不是定位到是接口里的。
31:06
但是真正运行的时候呢。是不是你这个实现类的呀。啊,来run一下。你看这时候呢,呃,这个我们是在最后这块啊,是不是让子弹飞一会儿啊,执行的就是它。啊,或者你这个点一个断点啊,比如我看我们再去做一个debug。哎,做到这个FLY这块了,FLY这块我们看一下这个源码哈,哎,这时候你看我点。诶,你看这时候不就点到这个实现类这块这个FLY了。哎,这呢,就说明还是一个去方法调用。啊,跟我们前面讲的这个类的多态性呢,是完全一样的啊。OK,那么这个多态性呢,我们就说完了,说这个说完以后呢,有什么用啊。啊,还是那意思啊,我们用接口体现是规范。凡是呢,用这个规范的地儿呢,我们就生明成这个接口了,但是你实际呢,有的时候呢,都是实现类的对象。哎,说的有点抽象了,来写例子啊。
32:00
在这儿举个例子,这个例子的话呢,我就拿这个来说。哎,就这几个图啊,哎,我拿这个来说。大家看一下啊。回到我们这个代码层面,咱们通过它呢,体现一下我们接口的应用,包括呢所谓的规范性,包括呢所谓的多态性。USB它的一个测试啊。首先呢,在这道题目当中呢,我们有一个接口。啊,Interface,我就叫做EB了。好,那么这个接口的话呢,是定义这种规范的啊,哎,所谓的定义规范呢,就是全世界范围内USB呢都是一样的,哎,我们这里边儿呢,就可以声明。啊,一些常量是吧。这个长量呢,就好比是咱们看到这个USB的,我就不写了,USB的这个叫长啊宽呀。对吧,哎,包括长宽高啊是吧?哎,包括你里边呢,有几个这个呃,数据传输的这个金属点呀,是吧?等等等,这个呢,我们都理解为呢,是一些常量,常量呢不能改啊,全世界范围内呢,大家都是这个标准。
33:04
啊好了,这个我就略了啊,然后呢,主要呢,我们来看一下这里边儿这个方法啊。这个方法的话呢,我们说呢,诶是抽象方法了,哎,就相当于是这个官方呢,它会给一些所谓的规范,所以呢,只要你是个USB啊这块呢,我们就可以有这样的一些方法啊abstract,哎,咱们就简单一点啊,哎一个叫start。我啊。哎,一个呢叫做stop,其他的这些方法呢,我就不写了啊。这个呢,我可以的把这个public of给省略了。好这样两个方法,好这就写完了啊,然后对于我们这个,呃,电脑来讲,电脑的话呢,就可以呢,跟uip的这种设备呢,去做数据的一个传输了。哎,我们这class一个比如叫computer。好,Computer这块呢,我们就可以呢,比如说public avoid,比如来个这个啊,传输这个具体的这个data数据跟谁传,跟我们这个USB传。
34:03
哎,这样是吧,然后在这里边的话呢,我们就可以呢,首先说这个呃设备呃连接成功。诶调调调好连接成功以后呢,我们就调这个USB这个设备呢,叫start了,他就开始做这个工作啊,诶具体这块呢,可能有一些这个细节,咱就诶不去写这么多了啊,就是数据传输的。啊,这个细节操作啊,这个我们就略了啊,好,那么传输完以后的话呢,我们再调这个USB呢,有一个叫stop这样一个方法。哎,这就叫传输结束了。OK啊好,这儿呢,我们就电脑呢,跟这个设备呢去做连接,你说具体这个设备是什么设备啊。我也不知道。哎,咱们大家电脑上不都有这个USB接口嘛,哎,你也不知道你要连什么设备,但是只要一连上的话呢,我们就会走这样一个流程。好,那么接下来的话呢,我们既然这个标准规范已经定义好了,我们就可以提供具体的一些外部设备了,比如说这个class。
35:01
啊,这块我们提到一个比如说打印机啊printer啊,这个打印机的话呢,诶我这里呢,就不描绘它的这个类了,咱们之间呢,光考虑接口,我让大家去实现这个USB。那实验这个接口呢,你得把这里边儿这个抽样方法呢,是不是得实现一下。这两个是吧,然后OK。好,这呢,咱们就简单的里边写句话啊,说这个叫打印机。哎,开始工作。啊,然后这块。哎,打印机啊,结束工作。没问题是吧。好,那么这个打印机呢,我们就写好了。诶,那么写好以后的话呢,诶如果呢,现在我们这个电脑呢,想去连这个打印机了,你说这块怎么做呢。哎,首先你得有一个具体的电脑了。诶,我们的computer啊,这个造一个具体的电脑。好,那么这个电脑的话呢,我们现在就想,诶这个transfer data想传输数据跟谁传呢?跟打印机传,那提前没有打印机,先造个打印机。
36:00
Printer。打印机啊,你一个printer。好打印你造好以后呢,我把这个对象呢,就往这一放就可以了。这块我们说诶等等是吧,诶我们现在就看到一个型了,啊说呢你声明的呢,是一个USB。然后呢,你实际上赋值的时候呢。是负的一个printer,把它的地址是不是给到这个了,所以呢,相当于你这个USB呢,就指向了这个打印机了。哎,这儿呢,不就是一个多肽吗。哎,多态的这个体现啊,哎换句话说呢,我们讲过说那接口你要没有多态性呢,就废了。啊,接口本身呢,没有过道器对象也造不了。然后呢,你还不让他用时间类的对象往这赋那不这块呢,就没法赋值了吗。哎,所以呢,接口啊,这样写的是不是一定要体现多态性啊。哎,对啊。好,那这样付完以后的话呢,我们,诶编译的时候呢,你看似掉的呢,还是USB的这两个方法啊,我按住CTRL键一点,是不是都点到USB这块了。都到这儿了啊,但实际上我们执行的时候呢,你是具体的打印机的了。
37:05
所以呢,我们就进行方法来重写,就是虚方法调用了啊运行。哎,这不就诶设备连接成功啊,电脑这块不是。在这块写的嘛,然后具体的start,这就你打印机的工作,呃,然后呢,传输的细节过了,然后最后关闭,关闭的是你打印机结束了。哎,这呢,就我们说的这样的一个情况啊。啊诶,所以呢,从这个角度来看,咱们平时用的说这个USB接口接口实际上呢,它就是一种规范。啊,就是一种规范啊,嗯,大家呢,嗯,就现在都是WIN10WIN11了啊,以前呢,用这个叉P啊,或者包括WIN7的时候呢,你会发现呢,我们经常呢,一连这个外部设备。他这块呢,会联网操作,然后会提示一个说安装相关的驱动是吧。见过吧,这个驱动是什么呀?对驱动啊,其实就是我们这个us接口呢,它这套标准已经定义好了,但是你连接这个外部设备呢,我不知道你是什么,你要是连接我这个电脑想进行数据传输的话呢,你得提供这一套实现类。
38:07
我这呢只有一个接口,实际上的话呢,它有好多接口啊。哎,你得提供这样的一套实践类,那么这一套实践类的集合。就是驱动。啊,你这块你连一个,呃,比如说你这个扫描仪吧,扫描仪呢,你想跟你电脑上去传输,你扫描仪呢,连上你电脑之后呢,呃,你到底怎么传呀,我这个USB是有我有一套标准,但是我这都是出方法呀。你你想怎么传呀,哎,那这块你得把你的这套驱动呢,先加载进来。或者你要是联网的话呢,去下载一下也行,那就相当于提供了一套,就是实现了接口的这样一套实现类。然后的话呢,我在电脑跟你去传的时候呢,我就按照你这套实现类里边这个实现的这种方法去做了。哎,就是这个道理啊。好这呢,我们是这个叫打印机,那同步的我们可以呢,再演示一个哈,比如这块我们class。啊,咱们这个叫。
39:00
开门是吧。是这样写吧。哎,让他呢,Implement一下,哎,这个USB啊。好,然后这块的话呢,我们也去呢,诶实现一下这里边儿这两个方法啊。这个呢叫照相机啊,开始工作啊。哎,照相机啊,结束工作。诶好这呢我就写完了啊好写完以后的话呢,诶我们上边呢,同样呢,也可以来进行这个测试,这块测试的话呢,诶我就想换一个场景了啊什么意思啊哎,我们还是拿着这个呃。电脑是吧,诶想连接谁呀,我想连接这个这个这个camera啊,这个相机,但是这块呢,我们没有给它显示的声明一个名了,我直接呢,就在这里边写的,那我就直接new一个叫camera是不是也可以。哎,这块我们再去做一个run。那这呢,就我们照相机的这个事儿。
40:00
哎,就这一块啊好,那么上下这两个呢,呃,如果我们上边这个看成是第一种方式呢,我们把下边这个呢,就看成第二种方式,哎,起个名字啊,这个呢,我们相当于呢叫创建。啊,接口实现类的对象。哎,结构实验类谁呀?Print对象,对象叫什么名啊。是吧,那第二的话呢,我们叫创建接口实现类的。匿名对象。这个对象是不是没有名啊?哎,这叫匿名对象,这个能看懂吧。这个要能看懂的话呢,我下边要写你就不一定能看得懂了。第三个哈。我现在的话呢,还是想调呢,调这个transfer里边呢,还要传一个USB的一个实现类的对象。那么现在呢,这个实现类。我们刚才呢,写的时候呢,这个叫printer,这个呢叫camera。哎,都有实践类都有名啊,现在这个实现类没有名了。
41:03
啊,这个大家呢,得从情感上呢,能够接受一下哈,实现类没有名了,那这块我们。这个这个要想声明个变量怎么办呢?那只能是先拿这个uip呢来顶一下了是吧。好,我这就写成USB了啊,这个对象呢,有一个名,咱就叫USB吧。右边这块呢,又尴尬了。因为呢,我们按照原来这个思路,你怎么扭,一后边是构造器,一看构造器跟类同名,我是不是就知道你是这个类叫什么名了。你有printer,你这不就叫print这个类吗?你有camera,你不有camera这类吗?现在这个类呢,匿名。这,这咋整?注意你看我现在我想是叫创建。接口匿名实现类的对象啊,这个对象有个名叫USB,但是这个类没有名了。你说我写个叉叉叉。
42:00
那这个叉叉叉就是你这个实现类的名。是吧,就暴露了,那怎么办呢?这块我们就一个USB。这样写了。诶,然后呢,U呢是有这个名的,我把这个名就放这儿了是吧,但是这块写呢还报错,这也是合情合理的,不报错呢,反而倒不正常了哈。因为呢,USB呢,是不是本身没有构造器啊。所以这块写肯定不对是吧。啊,那这个时候我们怎么看待呢,我还这样去写,你可以想象成呢,就是这个时间内呢,没有名,没有名呢,但是形式上呢,又得这样写,我们就拿usp呢。就充当一下是吧,你可以这样去理解,但是充当的话呢,还有一个问题啊,你这个时间内的话呢,呃,你得保证你不是充阳类。这样你才能找对象。目前来看的话呢,你是充当了行能忍了,但是你这个,哎,USB里边是不是有充方法呀。你有抽样方法,这个事儿我可帮不了你。你这个呢,抽样方法呢,不能够呃造对象嘛,是吧,那怎么办呀,那我就临时的在这块呢,把这两个方法呢给重写一下。
43:03
怎么写呢这呢,光标在这闪呢,我就整一对大括号。我就来一个回车。我就在这里边儿开始写。Public。Avoid start。诶,这是一个啊。Avoid stop。这是一个,诶你看不报错了。哎,就写完了啊,来把这里边呢,我们填充一下啊,比如说这呢,咱们就当做也是个U盘吧,哎,U盘诶开始工作啊。哎,这个我们叫U盘。哎,结束工作。好,那么然后呢,我把这个USB1呢就传到这儿了,接着呢我们就做执行了。哎,为了好看啊,咱们前面的我加个换行,来,我们去run一下。好,大家看。那这个U盘呢,还真就开始工作和技术工作了,这个正常执行了没问题,这块看看能不能接受。
44:06
哎,这个我再说两句哈,就是我们现在的这个叫接口的匿名实现类,这个位置呢,肯定要放实现类的这个类名了,但是现在呢,说匿名了,那我只能是拿USB呢去充当一下,那这个类呢,要想能够造对象呢,它必须得把这个充方法呢给实现一下,那我们就在后边这大括号里边临时的把它给实现一下就可以了,那此时呢,我们就能造这个对象,这个对象呢,目前还是有名的哈,所以我把USB呢就放在这儿了,那基于它呢,我们再来一个更夸张的。创建接口,匿名实现类的。匿名对象。啊,这个你看你会写不。我直接来了啊,点transfer。这里边儿直接就拗一个USB小括号显然不行,是不是再来个大括号?回车一下是吧。在这里边儿是不是得重写一下。对,你再把上面粘一下,或者呢,你这样啊,他不是在这报错吗?你out enter一下。
45:02
点一下。再点一下就给你自动放里边了。他说,哎,有点快了啊,再来一遍。你有一个USB。啊,这更快是吧,哎,这个回来是吧,来重来一下啊USB。你看这时候你要一回撤,它就给你生成好了啊,咱们自己来这呢,是一个小括号在整个大括号在这,哎,换行一下,然后把刚才的这俩呢,你给他CTRLC。哎,在这写一下就行。这个咱们比如说再换一个设备啊。这个扫描仪吧。哎,扫描仪啊,哎,开始工作。诶,扫描仪呢,结束工作,诶就起完了。嗯,这个的话呢,你看我们去调它的时候呢,这呢其实也是多态性哈,呃,你注意这个你可千万不要说我们拗了一个接口的对象啊。哎,有了一个接口实现类的对象,只不过这个实现类呢,没有名,但是仍然体现是多态性啊。
46:00
然后呢,诶你在这里边儿呢,这不就接着去调你这里边儿的这个start和stop,这呢,我都重写过了呀。哎,再去做一个run。诶扫描仪呢,这块就执行了。好,这块呢是有一些难度的哈,以后呢,我们在开发当中,比如我们调一个方法,这个方法呢,这个参数呢是一个接口,那我们呢,可能就是这样去写的,呃,这个大家呢,要能够去接受啊,等我们讲到这个,呃,最后一章叫扎阿巴新特性,我们还会讲叫拉姆达表达式。到那个时候写的呀,会更夸张是吧,你更不认识,当然前提呢,你先把这个先认识了啊,这个提前呢先练一练啊好,那这样的话呢,咱们就把这个回过来看一看啊,这个呢,我们叫接口的这种多态性,我们就讲了,顺带呢又讲了一下具体的这种。啊,我们说匿名的这种方式,大家呢去体会一下。啊,体会一下啊好,那么回过来啊,最后这块呢,还有一个面试题,这个面试题的话呢,其实也不难啊,也可以理解成是一个经典的名试题。
47:05
就比较老了是吧,哎,那么这俩呢,你看长得不太像啊,简单我们说一下啊,哎,让区分的长得不太像呢,有可能还真有一些共性。啊,那么他俩的这个共性是什么?都有抽样方法是吧,或者说呢,都可以有抽样方法,因为抽象类呢,有可能没有。是吧,哎这个共性的话呢,就是呃接口中,哎这样说吧,哎都可以有可以声明是吧。哎,抽象方法还有贡献吗?对,都不能实例化是吧,诶不能创建对象了啊,这一点是一样的啊,那么这一点虽然一样,但是他们这个原因呢,有区别啊,比如说都不能持续化,是因为都没有过道气吗。这个不是的,这个我们说呢,这个抽象类呢。它呢是一定有构造器的啊。因为你要不写它有默认的啊,一定有构导期,而这个接口呢是没有,诶构造器的就跟说呢一个呢,是能生孩子,但是没生。
48:06
一个呢,是根本就没有能力生是吧。当然这个例子也不太好哈,这个呢也其实也不能生是吧。好,这是这个特点哈,然后另外呢,还有什么点可以说呢。诶对这块呢,就提到了哈,毕竟你是个类,我这是个接口,诶那么具体的话呢,体现为呢,就是诶我们比如说提到了说诶类与类之间,或者这个类与抽样类之间呢,它这是一种继承关系是吧,然后呢,这个A类与接口之间。对,是时间关系。啊,这是一个点哈,然后另外呢,这个接口跟接口之间。哎,是哎,多继承关系啊。诶这呢,就是这种关系呢,不太一样了,当然你还可以去提一下关于这个属性的问题啊,这个抽象类里边的这个属性,你想怎么定义都行,而它呢,只能是常量了是吧。对啊,主要呢,就是大家呢,把它的一个共性呢,要呃稍微提出来啊,然后不同点啊,这个你再说说就行了,这块呢,我在课件里边呢,是放了一个,呃,他们俩的一个对比这块看有个图啊,写的相对来说详细一点,这个题目的话呢,其实本身呢,从一个使用角度来讲,大家基本上也不会把他俩整混了啊。
49:14
哎,直播呢,就是有的时候可能会问一问这个笔试题,但是现在问的也很少了,所以大家稍微关注一下就可以了啊。
我来说两句