00:00
好,那么这块呢,咱们接口这个课后练习题呢,就说了这样几个啊,大家下来呢,一定要自己去写一写啊,然后接下来我们说个什么事儿呢?诶说一下这个接口啊,一开始我们提到过它内部可以声明的结构啊,这个结构的话呢,从传统意义上来讲呢,一个呢,诶如果有船业面料,那就是敞亮,这个呢是一直没有变过的。在方法这块呢,有变化。那么在这八之前呢?我们在结果中只能够声明抽象方法。诶,咱们在开发的时候,如果在代码中定义接口的话呢,一般咱们定义的就都是这个事儿啊。都是这个事儿,但是呢,我们说呢,在GD8当中,呃,提到这个新特性,呃,这个新特性呢,就提到接口这呢,可以定义有方法体的方法了。挺特别的哈,因为传统的话呢,我们说接口你就是规范。哎,这个咱们说所谓的规范呢,就是它定义的这个抽象方法,但是这个规范怎么去落实呢,他没写。这都叫抽象方法了,但是从这B8开始呢,它既然可以有方法体的方法了,这个是非常大的一个变化。
01:07
而这种变化呢,其实咱们自己写代码的时候啊,在一个项目当中定义接口,咱们其实用的还是比较少的,更多的呢,还是我们看到一些源码层面接口里边,它扩充了一些有方法体的方法了。就是你可以直接用这些接口,然后用它里边这个带方法体的方法。啊进而,哎,你看哈,我这儿呢,是一个。类A。继承关系呢,咱们已经说过了啊,单继承性现在的话呢,我们可以呢,去实现多个接口。而且接口里边竟然可以有方法起的方法了。其实呢,它也会考虑是不是能够直接拿过来用啊。那就意味着我们从这个意义上来讲呢,你可以实现接口,而且可以实现多个接口,接口里边还有有方法体的方法,你也能够继承,哎叫实现过来,这不就相当于一定程度上确实缓解了他的这种单继承的局限性吗?啊,这个呢,就更好去体现这样一个场景了,好,那咱们下面就给大家演示一下这个一八里边这个新特性啊酒呢,这也就是顺带着一个方法的事儿啊,我们就一块儿来演示了啊,哎,我就在这里边去说,呃,这个演示的话呢,其实里边有一些小细节啊,我们要稍微的关注一下啊。
02:17
好,那么首先的话呢,我们去提供一个接口,这个接口的话呢,我们不妨呢叫做compare a。啊,因为这里边儿我要定义好多接口来通过这个名呢,我们做一个简单的区分啊好,那么首先呢,我们来说一下这个传统的这个属性。啊,这个呢,都是,哎,声明为。哎,这个叫sta,这不多说了啊,然后这个方法。哎,我们说呢,JDK8之前啊,只能。哎,抽象方法是吧,好,下边呢,我们来看一下这个方法,这个JDK8当中啊,首先是静态方法,哎。
03:01
Public static,这我们叫method。一吧。注意你看啊,有方体了。啊,这个我们就写个叫compare啊compare a这呢比我们写一个。咱先来个比如说北京吧。好,你看这个方法呢,它就是有方法体的啊,是个静态方法。就跟咱们平时写类里边现在放的一样啊。没任何区别,好,那这个写完以后,下面我们来看看他怎么用啊。首先我们去提供一个,哎,咱就叫做sub class吧。哎,叫他啊啊这个类的话呢,我让他去implement一下,你这个叫compare a。A compare a,那由于呢,你这个接口里边也没有出方法呀,所以写完之后呢,这不也不提示我说你去重血压实现啥的是吧。啊,就这样了啊好,这个我就先放到这儿,然后呢,咱们去写一个测试类啊。Class的一个测试。哎,没有方法一进来好。首先的话呢,大家你想啊,我现在呢,这个接口里边有一个静态方法,静态方法咱们都知道,直接拿你这个生命的主体去调,应该就可以是吧。
04:05
那你说我这块compare去掉行不?点二我们调MA1,你看没问题是吧,哎,我们run一下啊。你看没毛病啊。可以的,那我这块呢,关键问题就是说通过它的这个实现类叫sub class可不可以。感觉说那没什么道理,不可以是吧,但是你似乎看到他没给我提示啊。写了写了就报错了。说你这个静态的方法,它不能够让我们这个。你看只能是让我们这个接口它自己是吧,哎相继调用,哎相当于我们这个时限类呢,它调不了啊。这儿呢,就我们要说的是其中的第一个问题啊。这个呢,我们叫,呃,知识点一。就是。接口中。来声明的啊。静态方法只能被。啊,接口。
05:01
啊,来调用。哎,不能使用。其实限类进行调用。哎,这一点呢,比较特别啊,所以这个事儿呢,你就别想了。你说需要用需要用,那你就拿接口调就完了。啊,这是我们说的第一个问题,那么关于这个静态方法呢,咱们也就说到这儿了。哎,就这么一个细节啊好,那下边的话呢,我们来看一下,这个叫默认方法啊。哎,JDK8当中的默认方法,这个默认呢,它其实对应的有个关键字了。对,就是咱们像用这个Switch case里边有个叫default。诶跟这个关键字呢一样啊叫default,然后这个method来个二。啊,这呢,就我们所谓的叫默认方法啊,这个我们就再来一个叫A来一个上海。好,这个看一下啊,就是在我们普通这个方法呢,里边加了一个default,因为你要不加default的话呢,它会认为你省略了abstract了。
06:01
那就意味着他就认为你是一个抽象方法了,你就得这样写了。啊,那一旦我们要加上default的时候呢。他就没有那个abstract修饰了,他就说哦,你这不是一个抽象方法,那你就应该有方法体是吧。哎,就这个意思啊。啊compare a这呢来一个上海啊好,那么这呢是一个默认方法,那么这个默认方法呢,我们sub class呢,实现了这个接口A了,那相应的这个默认方法是不是也应能拿到了。好,拿到以后呢,我们来这块呢,做一个测试啊,因为呢,它是一个默认方法了,不是静态了,你得涉及到造对象了。对一。然后S一点我们去调,你看MA2呢是可以的啊好run一下。诶,你看没有问题。这个呢,应该是很好理解的哈,这是一个场景,而的话呢,如果我们在这个里边,你说我能不能对这个接口里边这个方法做一个重写呢。
07:02
其实可以的啊,你看写master的二的时候你看。他会这样给我们做个提示。啊,当然里边这个细节呢,咱们一会儿再说啊。好,那现在呢,我就可以做一个重写了。哎,这呢,我们就写个叫sub,哎,Class咱们也写个叫上海吧。好,这个写完以后呢,回到这儿呢,我们再去做这个测试,显然呢,就是调你重写以后的了。啊,这个跟类这块呢,其实是类似的是吧。把这个事儿呢,我们也稍微的说一下啊。啊,知识点二。啊,这个呢,就是呃,接口中。呃,声明的啊,我们叫默认方法可以被实现类。继承是吧,嗯,这个实现类。啊,在没有重写这个此方法的情况下。哎,默认呢,我们说调用接口中声明的默认方法。
08:01
那如果呢,时间类。重写了此方法啊,则要用的。哎,是自己。重写的是吧,方法啊。这个呢,因为你重启了,所以掉的就是你自己的了,所以这个呢也很好理解,这个没问题是吧。好,那么接着哈,大家看大家看,我这儿呢,是写了一个,我再来一个。啊,CTRLV这呢,我来一个叫三。啊,这个我们叫一个北上广深广州吧。广州是吧。好,那这儿呢,我定义了一个啊,这呢也是一个默认方法,然后呢,我再来一个接口。哎,这个接口呢,我们叫做诶B是吧。好,注意写错了啊接口。Interface啊好,这呢也是个接口,这个接口里边呢,我定义的这个所谓的默认方法呀,跟你A里边呢,这个整个声明啊是完全一样的。
09:00
拿过来这个呢,我们改成叫compare b啊广州吧。好,他的这个声明完全一样啊,现在问题我这个,那刚才那个到了。呃,但同时呢,它又实现了叫compare b了。诶,你看我这块一写这块就开始报错了。错误信息往这一看。说你这个呢,它继承了啊METHOD3了,哎,从这个A里边啊,B里边也继承了。哎,其实就针对MASTER3的这块有问题了。这个大家看能理解吗?他想说明什么问题?对,你这俩方法的话呢。诶,我我顺带我先问这样一个问题啊,咱们前面讲过抽样方法是吧,你说如果要compare a里边有个抽样方法啊,这个里边也有个抽样方法,他俩的声明完全一样啊。会不会有类似的问题呢?不会。
10:01
对,因为呢这个类呢,要想造对象的话呢,诶我们得把这个方法重写一下是吧,你这个重写呢,既看作是对它的重写,又看作是对它的重写了。你说我没重启,你是我是个创氧类,创类那也没关系啊,反正你这俩方法长得都一样,又没有方法洗,那就都认为你还有一个出氧方法就完了呗。所以呢,对于抽象方法这块没有问题。啊,但关键就是现在呢,这哥俩呢,他有这个默认方法,有方法体的,而且全都一样,在这个此类啊,或者叫实现类了啊,没有重启的情况下呢,就冲突了。冲突就在于说我们回到这个位置啊,你说我们通过S1咱去调一下三是不是就懵了。因为此时的这两个接口的地位对于这个类来讲是完全一样的啊,那他就不知道该调谁了。这就错了是吧,这运行肯定过不了啊,因为这块都报错了,所以呢,我们把这种问题呢,称为呢叫接口冲突啊。这个事儿呢,其实也很好理解啊,就是说这个类呢,实现了两个接口。
11:05
而。这个两个接口中定义了叫同名同参数的这个方法。我为什么强调这个事儿的话呢,因为我们是通过名和参数呢来确定某个方法的,你现在是同名存参数的,我不就确定不了是哪一个了吗。啊,同名层参数的叫默认方法啊。就我们说的这个DEF的方法,哎,那么则这个实现类啊在没有。重写词。嗯,两个接口。啊。这个默认方法的。情况下啊会报错,哎把这种报错呢,我们就称为呢,叫做接口冲突啊。啊,那么就要求呢,这个此时。这个类呢,或者叫实现类,必须要重写这个接口中定义的这个同名同参数的。
12:03
这个方法了,就是你不充血不行啊,所以这时候我们回到这个时间类这块呢,必须呢,咱们要把。这个所谓的这种接口里边的这种方法啊,我们CTRLC一下啊。这个我就先这么着吧,CTRLC一下啊。回到这儿,我们要写,哎,对于我们这个类来讲呢,这个就没有底的之说了啊,那就删掉了。这个我们叫class,诶就这么着一下。这时候呢,我们做了一个重写,这个所谓的重写呢,既看作是对compare a的重写,又看作是对B的重写,所以呢,再回过来,我们再去调,这个呢,就是你自己的了,这就不存在问题了。就是你自己的。啊,这个事儿呢,也比较好理解啊,好,那么基于这个点我再说啊,在这个A里边呢,我再加一个。这个呢,我叫做四。啊,这个呢叫深圳。诶,这没问题啊好,然后呢,我们同样的这个方法呢,我们有写在compare b里边,我写到了一个类,这个类呢是sub class的负类,叫做super class。
13:06
在这里边儿呢,我粘过来。叫他那类里边呢,没有default之数。写完了啊,写完以后的话呢,这时候我们让这个sub class呢,去继承于。咱们的叫super class,然后呢,再去实现这两个接口啊。那么这时候你发现,诶,怎么没有报错呢。原因就在于啊,为什么说报错呢?在这里边儿我定义了一个叫METHODS4是吧。诶,在我们这个接口里边是不是也有个MASTER4啊。名一样,参数也一样,那他俩怎么没事呢?啊,因为呢,这个类呢,跟这个接口的地位不平等是吧。哎,那么这时候呢,我们试着来调一下啊。回到这块,我们拿着这个S1去调一下这个METHOD4。那么我们想一下,他会是谁的?对,你会发现呢,他掉的是目前这个负类的是吧。
14:00
OK啊,所以呢,把这种情况呢,我们称为呢,叫类优先原则。哎,这个呢是知识点四啊,说这个呃,这个子类啊,这个我们也可以称为呢,叫做实现类,就看你针对谁来说了啊,它呢继承了父类。啊,继承了父类并实现了啊。接口是吧,然后呢类和接口中。声明了。那叫对同名同参数的这个方法。当然了,这里边儿对于接口来讲,这个方法呢,是默认方法啊,这个我在这稍微的呃,多说一句,呃,其中。接口中的这个方法。是这个默认方法啊,就是你别使抽样方法了。呃,定义了这个同名层参数的方法,哎,然后呢,这个默认情况下呢,子类啊,或者说呢,你叫这个实现类。在没有。
15:01
哎,重写此方法的情况下。啊,这个调用的是。对负类中的方法。哎,这个呢,我们称为呢,叫类优先原则啊。哎,这样的情况下,当然了,你说我这时候我子类这块去做这个重写了,那重写以后肯定是你自己的了,这都不用想了是吧,所以我这块我就也不做这个重写了啊。这个呢,就是我们说的这个知识点四。啊,这个我们就说完了啊,呃,基本上我们大体这个事儿呢,就说的差不多了,最后呢,我们再稍微的补一个内容啊,主歌内容是这样的,这呢叫s class,然后呢,我们在这块啊。嗯,稍微的我重写一下吧,方便我去说这样一个事儿啊,这呢,我写个METHOD4。啊,这让我们写成叫。Class是吧,这个呢叫哎深圳。啊,这个写完以后呢,再回到我们刚才这样一个测试这块,你再调的话呢,就调你自己的了。
16:03
啊,这没问题,好,然后呢,接着我们,嗯,下边说最后一个知识点啊,我呢就写一个普通的方法啊,Word我写一个叫method。哎,我就随便写个方法啊好,那么在这个方法里边呢,我现在呢,想调自己的,比如说这个MASTER4了。怎么写?是不是直接就买四就行了。这个呢,就是调用自己的啊,自己。呃,类中的这个方法了呗。但我要是想跳负类中的呢?这里边儿有一个METHOD4是吧,对这个呢,跟咱们前面一样啊,我调这个METHOD4呢,是负类里的,那就加个super点。诶,通过这样方式呢,调的是你负类当中啊没问题,好,这还有一个麦三呢,这个MA3呢,在我们这个副类里边。啊,父类里边啊,这块它没有了,那你要是在我们这个此类这块呢,我要是先写一个METHOD3这呢,是不是还是自己的。
17:03
好,我现在不想调自己的,我想调呢,它实现在接口里的。这会儿呢,你发现呢,它A里边有一个,B里边呢也有一个。那我想调的是A里的怎么办?这个首先也是叫自己的是吧。这个我们是调用。哎,负类中的。啊,虚会上表示福利的意思,现在呢,我想调的是你这个接口A里边的哈,怎么办。你可能会说,那我拿这个叫compare。啊,看。A去调吧,但是你注意这时候这个方法MA3不是静态的是吧。静态的话呢,是不是才能直接这样点是吧,不是静态的。那这块我们说呢,你这样一下。哎,这就可以了。对啊,Compare a点修复点method。哎,这样的结构啊,然后呢,我们再复制一份,自然而然的,你要是想调B里的呢,就这样写了。
18:01
哎,这呢表示啊调用啊接口A啊compare。呃,A中的这个,呃,默认方法,哎,这个我这样之所以这样写,是因为你自己重写过了啊,那A里边这个被重写的这个默认方法了。下边那就是那个B里边了。啊,这个稍微的大家去体会一下啊。好,所以说这个时候这个修复的话呢,它体现的其实也不是说非得叫负类的了,就是你继承的负类或者实现的接口都算是这种修复的场景。啊,都是基于实例来讲的,所以说呢,这就是看到算具体实例里边这样一个,哎一个方法啊,哎这样,所以呢,把这块呢,我们理解成了这个就叫哎知识点。五啊,就是诶如何在啊子类。哎,这个我们也可以称为呢,叫做实现类啊中。哎,调用。诶类啊或接口中的。
19:00
哎被哎重写的这个方法是吧,哎这呢,我们提到了这样相关的这个方式啊。好,那么这个说完以后的话呢,关于我们这个GD8当中的诶新特性呢,咱们就说完了,里边呢,说了几个事儿啊,这几个事儿的话呢,大家下来呢,其实也不用刻意的去看了,因为刚才这个演示的话呢,呃,相应的这个几个知识点过了过了一遍啊,大家其实也都比较清楚就可以了。咱们在实际开发当中定义接口的时候呢,一般不会去定义这个GT8里边儿这个新特性的方法的。更多的呢,是我们以后用Java核心的API的时候,它有些接口里边呢,写这样的方法啊,你知道怎么调就行。啊就行了,好,那顺带呢,我们再稍微的提一下这个JDK9啊。它的这个新特性。哎,这个呢,我们说呢,是可以呢去定义叫私有方法。这个先确认一下,我这块呢,咱们用的这个model是吧。我这用的是GP17哈,这呢10B的语法呢,也支持17这块,如果我写成八的话呢,你要是写这个九的九的这个语法就不行了啊,所以我这块还用这个17的这个语法规则,好在这个情况下呢,我就可以去演示九的新特性了,这个新特性呢,诶这个呢,注意叫私有的方法是吧。
20:12
来一个METHOD5。说呢,哎,我是接口中定义的私有方法是吧,完事了。那私有方法呢,咱们说了,你实现类是不是也不能够去继承了。也看不着,所以说这个方法做什么用的呢。就是自己用是吧。对,他自己干嘛要用呢。对,像上面这个方法,这不都有方法体吗。啊,尤其呢,这个方法你看不是静态的,那其实还不是给这个静态方法用的,就是给我们这些默认方法用的,也就相当于呢,你要是定义了好多默认方法,彼此之间呢,有一些共同的代码,你可以呢,把这个代码是不是专门抽取出来定义成一个方法,这个方法呢,也不对外暴露了,是不是就私有了。就这个意思啊,就这样用,其实这个新特性呢,我觉得在JTK8的时候呢,其实就可以引入。
21:02
啊,因为你有默认方法了,就可能有一些相同的代码吗?不就可以这样做吗?可能是八的时候给忘了是吧,有的时候呢,把它补上啊就可以了啊行,这个大家知晓一下就可以了啊就内部用的。好,那么这样的话呢,关于这个接口新的性呢,咱们就告一段落了,那整个呢,关于接口呢,咱们就也告一段落了,哎,后续的开发当中我们还会用到接口,到时候呢,大家再去熟悉一下就可以了。
我来说两句