00:00
好,那下面呢,咱们来说一下这两个稍微高大上的一个问题,其实第一个问题的话不太难理解,说接口距离使用的话呢,它必须呢,要体现这个多态性,那跟咱们上午讲的这个抽象类呢是一样的。抽象类和接口呢,他俩还确实在这方面呢,有个共性,就是抽象类和接口都不可以实例化。那一说这样的对比呢,这块又出现一个比较经典的面试题。啊,叫做抽象类与接口有哪些异同,这个呢,准备准备,明天的话呢,写一写是吧,每天考试的时候得出掉这个题,这个题的话呢,抽象类你可以叫abstract,这个呢叫interface了,你也可以看成是两个关键字了,那这两个关键字呢,长得还不太像,中文呢也不太像,有哪些异同,可能还真是有一些相同的地方。那比如说他俩都不能实例化这个事儿,哎,既然呢,这个接口和抽象类呢,都不能实例化,那如果我们一个方法的行参,如果写成一个抽象类,或者声明成一个接口了,你想我们要是用的话,是不是就必须呢,要体现这种多态的特性啊,我们去提供它的子类或者实现类的对象了,这就是所谓的多态性的体现,哎,那么这个规范呢,怎么来体现,刚才呢,也简单说了一下,但是呢还是比较抽象,所以这块呢,我们通过两个例子给大家来说明一下,这个叫多彩性和我们所谓的这个叫规范,那首先呢,我们来看左边这个例子,左边这个例子我们这儿呢,有一个接口叫做USB。
01:42
其实这个接口这个词在咱们Java这里边呢,咱们说叫这个interface了啊叫interface了,那这个你可以理解为呢,就是Java中跟类并列的这样的一个概念叫做接口,那其实咱们平时说话的时候,经常说你这个USB口接口是不是坏了,是不是也会提到这个接口的一个概念,对这个接口呢,就是可能是像我们平时所说的,就是你电脑上你能看到你摸得着的,那有一个口,你把那个口呢,就叫做USB接口了,那其实的话呢,你要是那边去讲说那个咱们说的B接口,其实跟这个接口的话呢,也有点共性,咱们说接口呢,说在Java里边,这个叫定义了一种规范,那咱们这个USB接口呢,其实也定义了一个规范。
02:24
那USB这个接口你你会发现全世界呢,大家用的都是这一个接口,长宽,包括里边那个深度,里边有几个针孔,然后呢,去这个这个金属点去你对接好以后呢,传输数据这个呢,最初就都规范好了,相当于呢,你就把这个可以理解为呢,就是咱们Java中这个接口呢,它都定义了一些常量,你的长啊宽呀是吧,比如传输速度的最大值是多少啊,这个你都可以理解为呢,是定义了一些常量,那么只要是USB接口,它都具有比如传输数据啊,哎,还有开启传输数据啊,包括结束啊这样一些功能,那就相当于也是像咱们这个接口中定义的一个功能一样,而且呢,这个USB接口本身,你说USB接口它其实也是稍微有点虚,你得看你是呃,这个U盘上的这个USB接口,还是打印机上的USB接口,还是你手机上的USB接接口,因为呢,不同的这个接口的话呢,它这个传输的数据的方式可能还不太一样。
03:22
诶,那不就正好说明这个USB接口呢,是世界呢做了一种规范,你可以说是某个组织定了一个规范,所以呢,首先呢,关于它这个长宽这个比例,或者它的一些速度的一些限制区间,这呢是一些常量,同时的话呢,这个接口呢,我们也定义了它的一些功能,但是呢,由于不知道你具体这个设备是什么,所以呢,我们只是在这个接口当中定义了一些抽象的方法,那我们在这个USB这个接口中,你定义的这些抽象方法。实际上呢,不就是一些规范吗?你想想是吧,谁要是比如说你现在造了一个设备,这个设备不知道是一个什么设备了,但是你这个设备呢,你希望呢,跟咱们电脑中的这个USB这个接口呢,能够连上来,那你是不是就要遵循人家这个USB这个接口中的这些规范。
04:11
长宽高等等这些呢,你得先拿过来,按照人家这个尺寸来,你不能到你这块,你往上一插,插不进去,或者插进去盖就掉了,那肯定尺寸不对,这是属于说你这个没遵循人家这个常量,那么方法的话呢,也是你插上以后呢,插上是插上了,但是呢,这个数据根本传输不了,因为我只电脑只识别USB里边要求的那些功能。甚至说那个方法名,我就用那个方法,你这块要没写那就不行,所以说呢,你还得把USB这个接口当中的这些方法呢,你还都得实现一下,那其实这些实现它可能不止这一个接口,可能有很多啊这些实现类的一个集合,实际上呢,我们就把它叫做驱动,一说驱动这不就理解了。大家现在你这个新装了一个系统,我们有时候经常是不是叫显卡驱动啊,声卡驱动啊这些驱动,哎另外的话呢,就是你要是这个,比如说你一个硬盘插到我这个电脑上以后,你会在这块位置会看到它是不是叫安装驱动啊,对这个安装驱动实际上的话就是我这USB这个接口呢,我定义了一些规范,你现在呢,拿这个设备想跟我电脑去传输数据了,你这里边儿呢,得把你这些这个具体的实现了,我这个USB这个接口的实现类的话,你得先跑起来。
05:31
因为真正运行的时候呢,是你这些具体的实现类的这些重写的,或者要实现的这些方法,我得先把你装一下,装完以后呢,我这时候传输速度呃,传输数据才能够根据这个时间内呢跟你去交互了,诶所以这呢,大家也可以去体会一下,我们其实这个USB接口跟咱们这个Java里边所谓的这个接口呢,实际上是可以统一在一起的,那它呢定义的一些数据传输的一些规范,那然后的话呢,这个凡是想用这个USB这个接口呢,你去实现它把这个规范呢都重写一下,重写以后你你跟电脑一交互就安装你这个驱动,其实呢,就相当于可以进行数据传输了,行,那把这个事儿的话呢,咱们用代码呢来实现一下啊,大家也可以来看一看。
06:17
好,这呢,我不妨呢,就叫做USB它的一个测试。这个呢,咱们可以看成这个叫接口的一个使用了,首先在这里边呢,我们去定义一个接口,呃,Interface叫USB了,这个接口呢,它其实有很多的方法了,这是咱们就写两个比较简单的,比如word一个叫stop,这叫开启了啊word我写一个叫stop,一个开启,一个终止行,这呢就定义了一些相关的规范,里边可能很多方法功能,这个属性的话呢,也有一些,比如我们定义了这个长。还有这个宽,这个尺寸以及呢,比如说最大哎,最小的传输速度。
07:07
等那这些的话呢,我们都是以常量的方式来存在的。行,那下边呢,就是具体的一些这个方法都是抽样方法,那下边咱们呢,去定一个这个,比如说叫U盘了,或者叫做。Flash是吧,啊这个上没写了,就以前的都叫闪盘是吧,盯着它,然后让他呢去implement咱们的USB。那实现一下,那实现的话呢,我们这呢,就把这两个抽样方法呢,也给大家,人家重写一下,这个呢,我们说叫啊U盘开启工作,哎,这个呢,就叫U盘结结束这个工作,行,这是一个了,那下边你还可以这个这个我这还写了一个这个打印机啊,那你可以再再提供一个printer去implements。
08:11
哎,咱们的USB,那我呢也把这两个方法呢,进行一个重写或者叫实现了啊这是打印机开启工作,那打印机结束工作保存一下行,这呢就写好了,那写好以后我们现在呢,有一个具体的一个叫电脑,我叫class,叫computer,这个电脑里边我们呢定义了一个方法,Public word,我这呢叫transfer data传输数据,传输数据的话呢,我们需要呢,借助这样的一个we部的设备,这个设备呢,我们就遵循了一个USB这样的一个规范,相当于呢,你给我传输数据的时候,传进来一个USB这样的一个对象了,哎,它不能到对象,你得拿实现类的对象在这里面呢,我们怎么传输数据呢?我首先呢,需要你这个USB呢,需要做一个大的开启。
09:08
然后开机以后,咱们下边呢,这个我就其实这块呢,你也可以把中间这块也造成一些抽象方法了啊,我们这呢叫具体的传输数据的细节,哎,那不同的设备呢,可能还不一样啊,你可以去提供很多的这种抽样方法了,这呢我们只抽出来两个最简单的啊开启然后呢,结束呢,这个传输完以后,那这块呢,我们再做一个stop,那这就做一个结束功能。行这那就行了,然后接下来咱们在这做一个测试,写个没方法没方法,首先呢,我们这电脑呢,去传输数据,你得给我来一个电脑,我们去造个电脑的对象。行,有了个电脑了,然后拿着这个电脑呢,咱们现在去调这个叫transfer哎data,哎,Transfer这个data我需要传递到一个USB,那本身呢,这个接口呢,又不可以去造对象,我们只能是造它的一个实现类的对象,这不就相当于体现了这个叫多态性吗?
10:17
等于new一个flash,然后呢,咱们把这个flash我CTRLC一下,CTRLV一下,这不就扔进去了,那相当于在这个角度呢,我们看到的呢,就是声明呢,是一个USB,但实际上呢,我们用的呢,是一个实现类的对象,这不就是这样的一个格式,那这个格式呢,我们说就体现了叫接口的多态性。啊,就是接口呢,使用上啊,也满足这个多态性,或者说换句话讲,就是咱们接口你要用的话呢,也必须得通过这种多彩的方式去用了,他自己又没有构造器,对象也造不了嘛,行,就这个事情,然后呢,当我们编译的时候呢,你会认为这掉的呢,都是这个所谓的叫抽象方法,但是你实际执行的还是我们这个实现类对象的这个重写了的方法,所以我们执行这是一个flash,在这呢,就是U盘的一个情况。
11:21
行,这呢,我们先说清楚了,这个就是一个多态性啊,其次的话呢,咱们这里边儿这个U盘,呃,这个USB,呃,这个USB啊,它其实体现了就是一种规范,我定义了一个,只要是跟电脑进行数据传输的一个规范,我就定义成交USB了,然后谁要是想跟这个电脑传输数据,你都得去实现这个接口,把这些规范呢都得明确一下。哎,就这个意思,这个能能稍微理解一下,我们说这个规范的意思吧,接口实际上就是呃,定义了一种规范。那具体的话呢,就看你是什么规范了,这个呢就是说跟电脑去传输数据的话呢,需要遵循这个数据传输的一个规范,我们叫USB的规范了,那我右边呢还举了一个例子,再来大家体会一下这个规范的问题啊,这个呢是咱们讲完这个Java SE这个高级部分以后,咱们呢讲完数据库要说的一个技术叫做JDBC。
12:19
那前面呢,我们说这个多态性的时候呢,稍微给大家说过啊,说JDBC里边呢,就这个体现这个多态性呢,就特别多了,那这块呢,就是这个意思,那上面呢,是咱们写的Java应用程序,咱们Java的应用程序写完以后,我呢要调一下这个JDBC,然后通过这个JDBC,咱们呢去操作具体的数据库。那么这个JDBC叫什么呢?就可以理解为我们用Java技术去操作数据库的,呃,Java语言去操作数据库的这样一门技术,那为什么把这个JDBC单独给他这个用一个绿色的标志出来,而没有说跟这个障碍应用程序合在一起啊,用一个整体呢,就是因为这个JDBC这里边呢,它定义了大量的接口,定义了大量的接口,接口呢说就是一种规范,那么JDBC定义了什么的规范呢?
13:12
就是如何操作数据库的规范,如何操作数据库的规范,那为什么要定义这个规范,大家想,其实没有JDBC的话呢,也可以,那怎么着呢,你拿着这个应用程序呢,直接去操作我们的这个具体的MYSQL了,但是呢,MYSQL跟其他的数据库显然是不同的数据库。那就意味着呢,我们操纵MYSQL呢,是这样一套情况,比如说你想添加一条数据,写了这个十行代码就搞定了,但是你要换成Oracle的话呢,Oracle这个事儿还挺多,它得写十五行,甚至说呢,在MYSQ里边,我们添加一条数据呢,我们叫艾的方法到你这个这个这个Oracle这块呢,它叫做insert了,方法名都不一样,那就意味着呢,我们是不是每针对一个数据库需要呢,独立的大家或者对于程序员来讲,你得知道这些数据库的这些细节呀。
14:03
然后呢,你针对myslel呢,开发了一个程序,然后下一个项目呢,就变成Oracle了,那你这块呢,是不是就得非常清楚Oracle的这个细节,包括用的是什么方法了,对吧,这就很麻烦了,另外一方面呢,就是如果你这个项目呢,用的是MYSQL,你想迁移到Oracle,那你这个代码呢,可能就需要大量的修改。很不方便,那基于这样的现实,萨公司说,萨公司说说呢,我来主导这个事儿,就不让我们这个成员呢,针对这个数据库这个细节了解这么多了,我这定一套标准。这套标准呢,我就封装在一起,叫做JDBC啊,就叫JDBC,我定义什么标准呢?就是到底怎么操作数据库,操作数据库都需要哪些步骤,比如说第一步需要连接,第二步呢,你要想添加,那你就添加,添加呢不是说你叫ad,你就叫隐私,叫什么的都乱七八糟的,我那就叫ad,那回头你们这些呢,只要是添加数据就不要用别的方法名都要用I。
15:00
等等类似的,他就做了很多的规范,但是这个规范呢,你想想他这些方法,比如说这爱的方法吧,他能写具体的方法体吗?他又不能写,因为写了也没用。它只是定义规范的,他也不知道你MYQ你想怎么做是吧,Oracle你想怎么做,我也不知道,你想都都想怎么做,所以我呢只提供一些抽象的方法,就是我只是指明说我们做的话呢,应该怎么做,但是具体该咋写呢,还得看你具体的数据库,所以说我们JDBC里边定义的都是这个接口,或者绝大部分都是接口了,那么我们这个Java成序员的话呢,咱们在编写代码的时候呢,就好比是你写了一个方法,像刚才一样,咱们那个参数呢,写的就是这个接口。当然当咱们真正去调数据库的时候,你要用的MYSQL,我们是不是就给你传一个MYSQL的一个某一个接口的实现类的对象给你传进去啊,就跟刚才USB一样,哎,相当于呢,也是体现了一个多态性了啊,那么接口呢,定义了很多,咱们都叫JDBC了,那么MYQL也好,它针对这些接口呢,它就把这个所有的时间类呢都实现了一下,它实现的时间类呢,放在一起,它就叫做MYS的一个驱动,所以呢,驱动就像刚才我们说的这个U盘啊打印机的这个驱动一样哈,驱动呢,就可以理解为是这个接口的这些好多这个实现类的一个集合,就叫做一个驱动。
16:30
放的呢,就是接口的实现类啊,那对于我们Java成员来讲呢,现在你不需要呢,直接去面向我们的这个数据库去编程了,而是呢面向接口去编程。我们在代码层面大家写出来的,或者你放眼望去,你写的代码当中不会出现具体的某一个数据库当中的API。就你看这API的话,你不会出现一个具体数据库的API的,而是呢,我们体现这API呢,这里边能看得到的这个在我们这个操作数据库这个层面啊,都是GDBC这里边这些结构,那就是多数呢都是接口。
17:07
啊,那么在一开始的时候呢,我们传的时候呢,其实你可以传字符串啊,或者传配置文件啊,这个后边这个方式就多了,我们呢可以体现呢,你传进来的都是实现类的这些对象啊,但是在代码层面,我们看不到第三方的这些API,所以我们这呢,就体现了另外一个词叫做面向接口编程这样的一个思想啊,你看上边这写的,这叫面向接口编程思想,说接口的主要用途呢,就是被实验类去实现,体现呢面向结果变成思想,下边说项目的具体需求是多变的,我们呢必须以不万不变应万变的这个方式呢,从中开发,此处的不变就是规范,因此呢,我们开发项目当中,开发项目的时候呢,都需要面向接口编程,诶这个事儿的话呢,应该算我们讲接口当中比较抽象或者比较难的一个事儿,大家呢,不用去纠结说什么叫面向接口,编程接口怎么叫一种规范了,不用着急去深入理解它,还是呢,先把这个接口这个基本的。
18:08
这个知识点会用了,这是最核心的,至于说这些理解性的东西呢,慢慢来啊,这是第一种一种规范,再说第三个点呢,就是我们在开发中啊,相当于呢叫体会面向。对,面向黑老且面面向在接口变成这个事的话呢,大家慢慢体会,咱们现在呢,建的代码还比较少,等到说这个JDBC的时候呢,一写代码你就知道哦,这原来就是面向结构编程,刚才呢我这都是干说啊嗯,你稍微呢能有点感觉那就不错了,就啊行这呢是咱们体会一下,通过刚才这个例子两个例子去体会一下这里边说的这几个问题。
我来说两句