00:00
行了,那这个呢,咱们就先说到这儿,那么接下来咱们继续再往下看啊。零三。那么这块呢,咱们public啊,Class test03。Public static void。那么这块呢,我想干啥呢?我想再去写两个接口,各位看好了啊。哎呀,错了,接口不是class啊,是interface,我这里呢还是讲这个接口的一个基础语法,各位看好了啊,Interface a。啊,然后这个里边呢,有一个方法叫做M1吧。啊,然后有个interface b。
01:01
叫M2。有个特。Face c。这个C呢,有一个方法叫M3。我现在有个class叫D。看好了啊。啊,能不能同时实现多个接口呢?我们测试一下。行吧,哎,我们测试一下,就这个实现,能不能实现多个接口。多继承。哎,我们之前好像讲过一个什么呀,叫接口和接口之间可以怎么着。多继承吧。那么我们类和接口之间能不能多实现呢?就之前对吧,就是接口和接口之间。
02:00
可支持什么呀,多继承。那么一个类可以同时实现。多个接口吗?比如说对于计算机来说。一个机箱上。有多个接口。对吧,一个接口是接。键盘的。一个接口是接鼠标的。一个接口是接电源的,一个接口是接。显示器的。等等等等。
03:01
啊,这只是举个例子,各位啊,只是举个例子,就说一个类能不能去实现多个接口。我说接口和接口之间是支持多继承的。什么意思?Interface X interface interface z去继承X和Y,这个是支持的呀,这是接口和接口之间的多继承吧。是不是一个XY,这是X接口,Y接口,然后Z接口是继承XY这是接口接口接口接口接口和接口多支持多继承,那如果说我们现在类和类。下面是一个类,上面是三个接口,能不能多实现呢?
04:01
A。我们编译一下不是这个啊,Java c0。第二,Java编译啊,可以啊,但是会报错。为什么会报错呢?因为你这个类啊,继承这三个接口之后,你M1M2和M3这三个方法是不是都得在这个D类里边写呀。你是不是都得重写呀,你现在没重写吧。没重写是不是报错呀?哎,没洗方法有报错啊,走你看。是不是D不是抽象的,并且未覆盖A中的M1?所以你要把M1怎么着在这里怎么着啊,哎,重写一下,加个大括号,前面加一个public。啊,是不是这里可以不写代码啊,无所谓,你只要把大括号加上就行了,这重写呀,是不是实现呀,对吧?哎,实现。实现A接口的什么M1吗方法啊,那么接下来再编译还会报错吧?
05:01
他问你怎么着啊,D不是抽象的,并且未覆盖B中的mmr,所以这个时候呢,你还得把这个B里边的M2怎么着啊,哎,你要给他再写一下啊,Public你看这块一个你都不能少啊,你还得再去实现什么呀,B接口中的什么M2。是不是,那你再去编译它还会有问题。是不是还要求你C里边M3,所以这个时候呢,你把M3拿过来,在这呢,你写上public m3来,接下来在这里你要写上叫实现接口C中的M3方法。M方法是这样的。好了,我们再来。是不是就通过了吧,哎,通过了啊通过了。所以这里呢,我想跟大家说的是什么呢。重点啊,五颗星123451个类,一个一个类。
06:05
不是抽象的啊,一个类可以同时。实现。多个接口。弥补了什么?大家想这种机制。我说了这个可以类似看成是继承,对吧,这种机制弥补了我们Java中的哪个缺陷,各位。这种机制弥补了Java中的哪个缺陷?Java中类和类是不是指这是单继承?Java中类和类只支持单继承?对吧,实际上单继承是为了简单而出现的。
07:00
对吧,实际上单继承啊,是为了简单而出现。现实世界中存在多继承。Java中的接口弥补了。多。弥补了单继承带来的什么缺陷?它实现多个接口,其实就类似于多继承。啊,实现多个接口,其实就类似于多什么呀,继承多继承啊,就是不仅接口跟接口之间可以多继承,你这个类和接口之间也支持多集成,可以实现多个接口用逗号隔开。但是你只要实现接口,就必须把接口里边所有的方法干什么。给他实现了,你有多少个方法?你都得干什么给他实现了?
08:05
明白吧,哎,都给它实现了。好了,那么这个例子呢,最主要啊,哎,我也不用在那写代码了。代码其实也不用写是吧,啊不用写啊,这个主要是跟大家说一下,说什么呢?说一下我们我们这个。嗯。这个一个类啊,和这个接口之间是什么呢?是一个实现的关系,另外呢,这个实现是可以实现多个接口的。啊,可以实现多个接口。哎,那你说我这块我用多肽该怎么用啊。如果你实现ABC的话,那我这块怎么写啊啊AA你有谁啊。6D吧,你想想。是不是AA6D呀。
09:01
那BB呢?BB是不是也D啊?CC是不是也6D呀?对吧,这是不是多肽呀。你想想,AA拗拗D嘛,BB6D嘛,CC也拗D嘛,这都是负类应用,负类型引用指向子类对项,都是负类型引用指向子类型对象,那么此处大家应该有疑问。我问大家,我A能不能去调用M2。A可以去调M2吗?A里边接口是不是只有一个M1?A里边是不是只有一个M1 a能去点M2吗?不行吧,因为M2是不是B里边的。对不对,就不行了啊不行了,那有的老师如果我想想让它去掉的话。我怎么办?
10:02
就你想让他去调M2,想让这个A去执行M2怎么办?向下转型能转吗?向下转型能转吗?我们尝试一下啊A是吧,转成转成谁呀B吧。这样转能转吗?来。编译一下。大家看行不行?这个程序。你看B2点什么。
11:01
你看啊。B点什么。M2。啊,然后在这个M2里边我们干什么呀,输出点东西。M2。有意思了,来。Java去运行TEST03。啊,T03走。M2行不行啊。没继成是吧,就尴尬了是吧,这块这一下就感觉,诶这咋回事啊,怎么A还能转成B吗。来,我们随便随便来俩接口啊。随便来俩接口,各位啊。这打条线。
12:00
上边呢,我们来一个interface。大写的啊,Interface。M。呃,然后呢,我们在这来一个class,这个class呢,叫做E吧,去实现这个M。啊,实现M好,大家看啊,接下来我干干什么呢?我在这这样做。我说什么呢,我说。M。M啊。这个没毛病吧。M是负吗?是不是来这大罐往这回一下,往这回一下啊,看着舒服点。你这个一是子类父类型一个引用。指向了子类型对象。对吧,没没毛病吧,接下来我把M转成K类型。
13:11
好,我们看行不行啊,能不能这样写。你看。可以。看见了吧,M想转成K。M和K有关系吗?问你的同学M和K有没有关系,来咱们这个互动一下啊,互动一下各位在在不在听啊。一会儿我再说一下,一会儿我再说一下啊。M和K。就是这个M和K有没有关系。没有关系是吧。哎,这一点要注意啊。
14:03
经过测试。接口和接口之间在进行强制类型转换的时候。啊。没有继承关系。也可以。强转。这个有点不一样啊,但是一定要注意。一定要注意。不是接口通用啊,你这个语法你就记一下你就行了啊,无所谓,但是一定要注意啊。运行时可能会出现。Class。Exception异常。
15:07
明白吗?它将来在转型的时候,它还如果你是一个K的话能转,如果运行你不是一个K的话。你不是一个K的话,仍然会报class cast exception这个异常。你把E要转成K来,我们现在运行一下。Java test03走。好,大家看是不是Java class e没有办法转成K。是不是是不是还是出现这个异常,第二七行。一样一样,各位跟以前也没讲新东西啊,没讲新东西只是说了一一点就是接口这边在向下转型的时候,两种类型之间没有集成关系,这么写代码编译器也不会报错。就说了这么一个东西,跟之前代码还是一样的。
16:00
同学,没蒙吧?我就我。没讲新东西啊,没讲新东西各位啊,这里没讲新东西。就是说接口A和接口B。接口A和接口B虽然没有继承关系,但是写代码的时候。可以互转。编译器没意见啊,但是运行时可能出现什么呀,Exception。Class exception。好,大家看这个有没有问题。EK。
17:01
说E不能转成K,看这个有没有问题,各位。这个编译没问题,运行也没问题,因为你A指向的这个对象就是D。对吧,同时你D又是又是一个B嘛,所以你转成B是没问题的,你看。对吧,哎,你下面这个呢。编译没问题。对吧,运行问见了问问。运气问题,因为你M这块是一个E对象啊,E对象跟K没关系啊。E是继承的M嘛。所以在运行的就有问题了。哎,之前我们有个结论,各位什么结论还记得吗?我们说无论线上转型还是线上转型,两种类型之间比较。
18:02
就是之前啊,我之前之前有一个结论各位。什么?结论就是无论什么向上转型还是向下转型,两种类型之间必须要有继承关系。没有继承关系,编译器会报错。这句话不适用在接口方面啊,这句话不用。在接口方面。但是我问大家运行的时候是不是还是那个,还是还是该报错还是报错呀。就你如果运行的时候,底层对象,你这个对象是个E对象,你E对象你跟K没关系,你硬转成K就就有就有问题的。有问题就跟之前一样啊,就是说你向下转型还是加还是得加instance of啊。
19:04
最终实际上和之前还是一样,需要加什么instance of运算符进行判断。向下转型向下转型,养成好习惯。啊。转型之前先if判断啊,先if加什么instance of进行判断,如果是的话你再转。对吧,所以这个代码你应该怎么写啊,如果说你的这个M嘛,它是一个k instance of k,我们再写这个代码。大家看这一次再运行是不是就没问题了,就没报错呀。为什么没报错呀?
20:01
因为这个条件不成立啊,M不是K呀。只有M是K的时候,我们是不是在运行这个代码,现在这个代码没执行,为什么?因为这个M不是K呀。不是K,所以这个就没执行。哎,我觉得大家不用想这么多啊,不用想这么多。不用想这么多,各位啊。这个例子我在强调上最主要讲的是什么?最主要讲的是我们一个类。嗯嗯,宇阳说的对啊,宇阳说的对,有道理啊,有道理,其实这种机制啊,没没有没有没啥作用,没用。没用啊,反而还会让人迷糊是不是?哎,没有继承的时候就应该报错,其实它这个设计我觉得也是应该这样。
21:01
但确实在我在这个,呃,我们在编写代码的时候,我们在测试的时候,大家发现接口之间。接口之间你M。是和K之是没有。对吧,哎,但是线下转型的时候,他确实没没没编译报错。啊,算是Java的bug吗?这个怎么说呢?嗯。咱咱最好不要说人家有bug啊,最好不要说人家有bug,呃,这么说不太好,这么说不太好,因为我们毕竟不是权威啊,不是毕竟不是权威,不要说人家有bug啊。呃,骚操作我觉得可以,可以叫骚操作啊,这个没问题啊。就是说大家还按以前的那种方式去学就行了,没关系没关系啊。跟以前没什么区别,没什么区别,就是唯独接口这挺贱的对吧,为什么挺贱的,因为M和K之间半毛钱关系没有。对吧,半毛钱关系没有,但M在转成K的时候。
22:01
怎么着啊,这边诶你看没没没编译,编译器让你过了。啊,编辑让你过了啊,呃,怎么说呢,其实散公司在这儿啊,他也有苦衷。啊,有这个苦衷。因为接口是纯抽象的,这个接口也是纯抽象的。呃,接口之间,它最终指向的这个对象是个什么东西,编译器根本就不知道。明白吧,编译器根本就不知道你最终指向的对象是啥。啊。嗯,也许他是这么想的,也许你这个类啊,既实现了这个接口,也是实现了这个接口。那你本来怎么着啊,K和M之间是没有关系的,对吧,你实现了K和M这两个接口之后怎么着啊,就让K和M之间产生的关系对不对,但是编译器他他不知道这件事,他不去理会这件事儿。所以呢,这边呢,就是两个接口之间没有集成关系啊,他怎么着啊。他也允许你怎么着这样去写了?
23:02
但是呢?运行运行的时候各位啊,运行的时候它该报错还是报错。啊。对,运行报错,嗯。编译没问题啊,Idea是自动编译的啊,Idea自动编译。不需要人工啊。不需要人工啊。行,那这个知识点就当没讲,各位啊,这个知识点就当没讲。不,咱不用研究这个了啊,这个知识点就当没讲,没讲也行,无所谓。无所谓啊,这个就当没说,说了之后反而让大家迷糊了,就像刚才同学所说的,就迷糊了啊,迷糊了。对,就是接口这个这个能看明白吗?咱咱回到回到原点,各位啊,我们来这个代码能不能看明白,明白的话打个一来。为什么A等于六,DB等于六,DC等于6D?
24:05
这是不是多肽?这能看懂吧,哎,能看懂就行啊。然后去调方法呗。调接口里的方法就行了。但如果你直接用A调的话。你只能怎么调啊。调M1,你没法去调M2啊,你说你a.M2能调吗?编译器报错,你看报什么错呀,说你A接口里边没有MR,你看说类型A的变量A。符号是M2说找不到,符号说从A里边找,M2找不到,他去哪找?非常显然的,A的类型是A,他去A这个接口里面去找,M2没有。明白吧,这个就编译器报错了啊,编译报错。A接口中没有什么呀,M2方法。啊,没有M2方法,各位啊,没有M2方法,那刚才就说到哪了,说这个如果你想去执行这个M2的话,你可以转型,你看就转成这样呗。
25:10
你把A转成B,你去B m2可以。对吧,哎,如果想调接别的接口中的方法,你需要转接口。转接口啊,就是调用其他。接口中的方法,你需要转型。啊,叫接口转型啊。接口转型。对,你转成什么呀,转成B。嗯。你就可以掉了。当然你还有另外一个方法,有同学老师,我能不能直接一步到位转成D型吗?直接向下转型为D可以吗?
26:00
当然可以,你用D去调M2行不行啊。没问题啊,你A直接一步到位啊转成D,它是个D啊转成D吗?是不是哎用D去调M2行吗。没问题啊,因为你D已经实现了继承了嘛,所以这块是没问题的。啊,就你可以这样转,也可以这样转,就是转成转接口也可以,也可以转什么呀,也可以转,转成这个最终的这个子类也是允许的啊来我们去编译一下,好大家看现在是没问题的,Java器运行TEST03走。M2 m2是不是,哎,这个M2在这儿呢,怎么着啊执行了。对吧,都可以执行。你上面这个转了调M2可以,我这边转成D去调M2也是可以的,转成B可以,调M2是因为B里边确实有M2。这个B接口当中确实有这个MR。有这样吗?哎呀,我讲多了各位啊,我不应该讲这么多,我应该简单讲一下啊,简单讲一下这块,因为呃,最主要想说的不是这个啊,不是这个转型的事儿啊,最主要我再强调一下是因为我想说的是一个类可以怎么着实现什么多个接口。
27:09
啊。行,休息一下。
我来说两句