00:00
行,那这个完了以后,那再往下走,这呢,我们就提到了一个什么问题呢,就是我们账二八当中这个接口的新特性了,那接口中这个新特性,那下边呢,我们来说一下这个咱们这个讲的时候呢,说提到了一开始讲接口的时候提到了说JAVA7呢,咱们规定呢,说类中只能定义两个结构,一个呢叫全息常量,一个呢叫抽样方法。这个话呢,仅限于这个版本是七至七,以前的时候这么说呢没问题,那八呢,现在已经也公布了好几年了,哎,再这样说呢,就不太合适了,这个JAVA8的话呢,我们说除了定义全局常量和抽象方法之外呢,还可以在接口中定义静态方法和默认方法,由于呢,咱们当前呢,装的咱们第一天装的都是JDK8了,在这呢,你也能看到它识别的就是JDK1.8,所以说呢,咱们现在呢,实际上是可以测试八当中的这些新特性的,那不妨呢,我这块呢专门建一个包。这个呢,我就。JAVA2,我就JAVA8JAVA8吧,这就是这个巴里的。
01:07
直接我这就close off行,这呢就扎巴的这个新特性,那么这时候呢,我们提到说接口中呀,还可以去定义静态方法和默认方法,那咱们就先整的这个接口,我这定义错了,先去定一个接口,这个呢,我就先叫compare a了。就是没有具体的一个情境了,这个就是直接定义这个接口,在这呢,我们说明一下,说JDK8当中这个我就把它粘过来。除了呢定义这个全局常量和抽象方法之外,我们还可以去定义叫静态方法和默认方法,行,首先呢,我们来定义一个叫静态方法static word,我叫做ME1。行麦穗一大家看,原来在接口中,在JA28里边还可以有方法体。
02:00
很帅是吧?方法题里边你还可以写代码,那我们叫compare a,比如我这就写个叫北京。说白了这个接口是不是改完以后越来越像累了呀,是吧?呃,原来我们说这个接口呢,你是定义规范的,这一定要这个坚持底线,就是光定义抽象方法,光定义规范不要有方法体,现在说也妥协了,说要不来两个有方法体的是吧?哎,那有方法体了,你说白了是不是就我们子类也好啊,实间类也好,你实验以后就不用你再去考虑重启了,对,其实说白了就挺像类的嘛。就停像类了啊,像那个类了靠近了好这呢叫静态方法,那第一个默认方法,默认方法呢,默认默认那就default这个单词呢,你得写出来METHOD2DEFAULT是不是咱们原来在这个,所以这case default见过这个。那这里边儿我也就简单的写一个输出语句,那compare a这写一个上海。
03:05
诶这呢就叫一个默认方法,那这个默认方法的话呢,呃,这个包括这个静态的方法,你看前面都是public的,其实这块呢,照样的,你这个public呢,是可以省略掉的。这是省略了,而不是说呢,这时候它的权限变成缺形了,不是对你看这块我在奥特line这块呢,你看是不是能看到这个小圆球,这圆球呢,其实就表示的它是权限的意思啊,这里边我们这个权限呢,都比较大一些啊,这个你怎么证明,你看咱们写这个circle的时候,你在这块看肯定私有的长这个样子,圆球呢,这都是public的。哎,你就知道咱们刚才呢,这里边写的其实都是一个public的啊,虽然呢,我把这个public给大家干掉了,行这呢就是我们所说的叫静态方法。那下边呢,就两个叫默认方法。默认默认方法,这个静态方法那就是静态的,说白了就是我们可以直接通过接口来调的,那默认方法呢,默认方法呢,没有加static了,那只能是我们整一个实现类,实现类那个对象里边,相当于这是一个普通的非静态的方法一样。
04:22
行这呢我们知道能定义了,那定义以后呢,我们得稍微看一下吧,看下这个怎么用啊,这个我们下边呢,去造一个具体的这个我我我这叫一个sub class了,S class它的一个嗯,Sub class我叫测试版,行在这呢,我去声明一个class叫sub class,我让他呢去implement。Play,咱们这个叫compare a,我呢实现一下这个compare a这个接口实现完以后你发现诶。马上什么事也没有。因为呢,你这里边是不是连一个抽象方法也没有啊对,这不都是有方法体的嘛,所以没有问题,那没有问题的话呢,这个这个似乎呢,我们在这呢,是不是直接呢就可以去写个没方法了,这个没方法我呢通过咱们这个这个其实叫实现类了,我叫s new一个它另外以后我这时候呢,是不是感兴趣的是我这S能掉啥了,毕竟呢,我们实现了接口了,接口呢里边呢又定义了静态方法和。
05:30
默认方法,你看我这有S点,咱们那叫METHOD123,你发现是不是没有一啊,没有一,那我就硬写个一,肯定会报错,看看他这个信息写的是什么。他既然说的说我们在这个s class当中没有定义过方法一,这真是完全看不到啊。是吧,就是这个接口,我们里边呢,定义了一个静态方法,它既然在这块呢,完全无视说你这块就跟咱们好比是你写了个四一样啊。
06:13
你看写个四,这就相当于是不是叫没有定义啊,那我这刚才写了个一,他是不是也认为说叫没有定义啊,就完全无视,那就相当于我们这个接口中,你定义的这个叫静态的方法,似乎呢,这个时间内好像就根本就拿不到。那事实上呢,也确实这样,那你拿不到,那你说我这个接口中的这个静态方法定义它有什么意义呢。子类拿不到,或者叫实验类拿不到,那我就自己用呗,对,所以这里边儿我们能说的第一个知识点。质点一,那就是接口中定义的这个叫静态方法,对,只能通过接口来调用,别的就不用多说了,就是你想通过这个实现类的对象,你实现类的对象你都调不了,那你想通过这个所谓的实现类去调,那就更别想了。
07:10
也是不OK的,这个确认一下我没写错啊,这呢也不行,这呢只能是拿人家这个接口去掉。第二我们这呢,写一个message,你看这是可以的。一。没问题,好,这呢就是我们说这个接口当中这个静态方法的一个情况,说白了就是我们接口中定义的这个静态方法,我根本就不是想让你这个实现类去继承的,我就想自己用的,那这样用的话呢,其实我们这个接口啊,它就有点像工具类了。你想是吧,有点像工具类了,我定义了一个方法,然后可能会有参数,直接你调这个方法里边传参数就去操作了,确实呢是往这块靠近了,那在咱们这个Java开发当中呢,咱们后边呢,讲这个集合的时候,有一个接口呢,叫做collection。
08:06
就是这块我们只是简单提一下啊,不用有太大压力,这呢是一个collection接口,就是集合这块的,这个呢叫collections,是来操作我们这个集合的一些工具类。就有点类似于咱们前面说的这个数组,这呢是一个数组的工具类一样。那那数字的工具类,工具类它是一个类了,我们这个工具类里边呢,它就定义了很多这个静态的方法,我们去操作了,那现在这个扎二八来了以后呢,实际上相当于呢,就是咱们可以把以后在collections里边你写的这些所谓的静态方法,是不是你直接就扔到我这里边儿就可以了。我直接呢,这也是个接口,我这个接口里边定义的静态方法,其实呢,相当于我自身呢,就可以充当是一个工具类的角色了,我们这个具体的你回头拿这个此类咱们去继承一个collection的时候呢,不影响啊,你静态的话呢,你这块也不用你管,你也提升不到啊。
09:01
对吧,你也记不到你这块呢,该去重写,你还去重写我原来的那些抽象方法,我这些静态方法呢,我还是直接用,相当于慢慢的我们就可以把这个东西呢,慢慢给它替换掉了。那这块呢,也类似pass和加S的这个pass,当然这个替换这个事儿呢,不是说张阿八这样整了,张VA9立马干掉了,那之前的代码咱们也得去兼容,只是说呢,他慢慢的往这块去推进啊,往这块去推进,这是它的一个演变的一个方向啊,大家了解一下这个事儿,就是这里提到了一个叫静态方法的问题。行,这是第一个知识点啊,那么接下来的话呢,我们感兴趣的就是咱们通过这个。对象咱们呢,还是可以去调用它里边这个默认的方法的,就是关于这个默认的方法呢,咱们还是可以直接拿到的。那相当于咱们直接通过s.method这个二也好三也好,这个还是可以的,执行没有问题,哎这呢,我们也把这个事呢简单说一下,哎,知识点二,那叫通过,通过什么呢?叫实现类的对象,这个可以调用接口中的默认方法,那么我通过类能调法。
10:18
这个萨拉这个你想想其实都有点困难。对这这不行,因为呢,人家这个METHOD2,它又不是一个静态的,所以这些呢,这就不用多想了,这肯定还是不可以的啊,所以说还是呢,得通过这个实现类的对象去调用,去调用,那其实这个默认方法呢,就跟咱们原来说你从负类里边拿到一个方法一样,哎,拿一个方法一样,那接下来个问题。我是不是也可以考虑重写一下?就是我们这个MA2从这里拿到的,我们是不是也想看看能不能重启吧,来CTRLC一下。那重写你不得放这重写吗?CTRLV这呢default你就别写了,这样子诶你看,而且这个呢,你看还是个实心的。
11:06
所以再次证明呢,就是你要是覆盖的那个东西有方法体的,就这个都叫这个over read了,你要覆盖的那个结构呢,覆盖的那个方法没有方法体就抽象的话呢,它就叫实现了,也就这么个小点啊,当然你泛泛的都称作叫重写也可以啊,那么我们在这个MASTER2当中,我就写一个叫s class。写一个上海。那这时候呢,我们再看一下这个方法,刚才呢,执行的是我们这个接口中的这个。哎,现在呢,你看就变成它了,哎,那就意味着说这个通过时间类的对象可以调用接口中的默认方法,那么接着说呢,就是如果呢,这个实现类要重写了接口中的这个默认方法,那么调用时这个仍然调用的是我们重写的这个方法,这个跟咱们前面呢说的那个继承以后的这个重写呢,是一脉相承的,仍然调用的是重写的方法,就是重写以后的。
12:14
这样的一个方法。就是当然从这也默认的,呃,也也相当于提到了,说我们是可以去重写它这个默认方法的啊行,这呢是我们说的这个知识点了,这个知识点这就说完了,这个说完以后,接下来我们再说一个事儿,咱们这呢是让这个接口呢,呃,让这个实验内呢去实现一个接口了,我呢,是不是有可能还会给它整一个负类啊。我这来一个负类叫super class,这个super class里边呢,我呢也定义了一个方法public word,我呢也恰好教一个METHOD3,跟咱们接口当中这个METHOD3呢,就就除了这不一样之外呢,其他都一样,在这里边我写一个s out叫super class。
13:03
嗯,我这也写一个北京吧,负类的,这是一个父类的方法,然后呢,我们这个接口中呢,也定义了一个METHOD3,在咱们这个子类当中,我现在呢,让它去继承于库类。形成类的同时我们去实现这个接口。那想想我们这时候这个此类这里边有的东西啊,这个它里边呢,有一个静态的,别抢了,用不了直接人家自己用,然后这里边呢,定义了两个默认方法,一个叫二,一个叫三,三的话呢,呃,先说二吧,二呢,你重写了,二重写了那就掉你自己的了,那现在三三的话呢,复类里边跟这个接口中,诶同名了,同名了,你说我这时候掉了个三。目前看好像还没什么问题,那时候我这会掉了一个三,这是谁的伞?两个两个都掉啊,两个都掉一点不靠谱了,他没有报错,没有报错呢,其实像这种情况,编译没有报错呢,基本上运行呢,也不会有问题了,那我们就直接看这个结果了就行了。
14:20
是不是出来这个叫super class了,对,那这呢就相当于它的一个规定了,这就一个规定了,就在这个方法层面的话呢,它还是有一个区分,说默认用谁的了,咱们那会儿做那个笔试题,是不是那个属性不行是吧?诶在这呢,这个方法呢,它竟然没有报错,那这块我们怎么去描述呢?我们说一个叫知识点三。这样说说,如果呢,这个咱们叫子类,这个或者叫实现类吧,就是针对于它的不同的结构来讲呢,名不一样了,针对于父类呢,叫子类,针对于接口呢,叫实现类了,说这个如果子类或实现类,它继承的继承的这个父类啊和实现的这个接口中。
15:06
时间的。接口中叫声明了。声明了叫同名同参数的方法,呃,这个,那么那么此类此类,在没有重写此方法的情况下。这个我们说默认呢,调用的是父类中的这个方法,同名同参数的这个方法,就是你要是重写了,重写呢,是不是就以你重写的为准了,不管是从咱们刚才说的METHOD2的角度来讲,你要是重写了这个接口中的,那以你为准,你要负类里边呢,那咱们以前也讲过,那肯定是都以你为准了,关键呢,就是现在我没有重写,这呢,我们说调用的叫负类中的同名同参数方法,把这个事儿呢,我们称作叫类优先原则。
16:07
类优先原则,但是你会发现这个类优先原则我们仅仅是针对咱当前讲的这个方法的这个来讲的,咱们那会儿做的这个笔试题,这可没有说类有先了,这呢是晕了是吧,这个呢,就是他认为说你这个也没有覆盖之说了,这个呢就是你必须得显示区分啊,还是有区别的,行,这呢这是咱们说的这个以你为优先,这样去考虑没有问题的,好,那么接下来的话呢,我们再整一个接口,其实呢,就想体会一下实际开发场景当中的一些不同的点了,那再整一个什么呢?我这来一个叫interface,我来一个compare,啊compare b,这又个接口。这个接口里边呢,不妨呢,我就也整一个这个三吧,CTRLC。
17:00
我也整这个三,这呢,我叫compare b。写的是一个上海行,就还是上海这儿呢,我这个接口呢叫METHOD3,这个叫MESSAGE3,然后回过来到我们这个时间类这块,我呢继承呃实现了这个compare a,我们可以多实现,对,然后我又把这个compare b呢也给实现了。实际上以后我这儿如果还是掉了三谁的。把这个就删掉吧,这个没啥用啊,是不是还是我们这个负类里的,因为你这时候呢,你实现的这个接口,你接口不管你有多少个,这肯定是以负类为准了,那现在的问题是什么呢?我我我没有继承,你看啊,我现在没有继承了,没有继承那就意味着现在我们这个MA3呢,它里边有一个啊,它里边有一个,而且这两个呢,你要是都没有方法体就算了,就是你要是都是抽象的还可以。
18:07
能理解不,它如果这两个里边都是抽象的方法,其实有点像咱们刚才是不是又说的这道题了,我这个里边,哎,我们实现了它,因为这个又实现了啊,相当于咱们这个呢,就实现了它俩了,我们这俩里边都有叫类方法,咱们这呢,重写一个或要实现一个,相当于把它俩就都重写了,这没毛病哈,但现在呢,咱们你没有重写,没有重写因为啥呢?你这里边又不是抽样的,但是呢,人家这俩方法体还不一样。这呢,其实是不是也自然就是他报错是不是也应该报啊对,就是我到底去调这个MASTER3,我们执行的应该是谁离的。是不是就确实有这个问题啊,对的啊,那这个点的话呢,我在这儿来看的话呢,似乎就不是特别的这个这个写了个三,那我再写还得还得还得是在这写是吧,写个知识点四。
19:02
写两个四了,四是什么意思呢?说呢,如果这个时间类,如果实现类呢,我们说实现了多个接口,这个实现了多个接口,而这多个接口中定义了叫同名同参数的默认方法,这个咱们这也得明确一下,这是一个默认方法。定义了同名同参数的默认方法,那么我们说这个,那么在我们这个实现类没有重写的情况下,没有重写此方法的这个情况下,是不是就报错了,哎,把这种错误的话呢,我们称作叫接口冲突。这个咱们在PPT里边,对这俩叫接口冲突啊。
20:00
这个冲突的话呢,我们觉得是非诚合理的,你不冲突反而倒不合理了,嗯,这个你俩接口都有这个默认方法,都有方法体,我不知道该调谁呢,合情合理,那么既然冲突了,你还就想实现这两个接口,那怎么办呀,结果冲突你不能让他就在这冲突呀,这就需要我们是不是必须在实现类中重写词方法呀,重写词方法。那这呢,你就别多想了,这个方法呢,是必须要重写的啦,来一个public word,来一个METHOD3。还重启,那重启的话呢,自然而然的就是你自己的了。这个来一个深圳,那你既然都重启了啊,那当然你调的话呢,是不是就是你自己重启的这个了,对的啊,这个就很好理解了,那咱们刚才那会儿讲的相当于是你要是这个,呃,顺便呢,还有一个负类的时候呢,那是不会有冲突的,关键的就是冲突呢,就是说你的福利也没有啊,然后这时候呢,只是有两个接口,这个时候他就有冲突了,嗯。
21:10
多个类怎么就会有多个类了呢?既那就可有多个类,什么意思?我没听明白,类有类不就一个吗?不是,那无所谓,只能有一个了。听明白了吗?我还没听明白,能有多个负雷吗?不就一个负雷吗?接口你可以多个,那负雷不就一个吗?是啊啊行,那就就是没没有没问题是吧,就是你自己可能是多想一些是吧,下来咱们再交流啊,那这块呢,这不就解决这个问题了,就是我们这块呢,做了一个重写了,哎,这就可以了,那重写OK,没问题了,然后下个问题就是咱们呢,在前面讲这个子类,讲这个父类的时候呢,咱们提过说父类中有个方法,我们子类呢可以去重写,重写完以后咱们呢再去调,就调的是这个子类的一个方法了,但是如果说我们在子类这个代码当中有需求说,我就想着调一下负雷动的方法。
22:23
咱们当时说过叫super对吧,在这呢,咱们不妨呢,也我就写一个普通的方法,我叫my method吧,在这这是咱们定义一个普通方法,我在我们这个子类或者叫实验类当中,咱们呢,如果现在就写个M3。那这呢,因为我们重写过了,是不是肯定是自己的这个重写的方法,自己定义的叫重写的这个方法啦,然后呢,如果我此时想调这个负类中的那个。那就是super第2METHOD3倍这种我们是调用的是负类中这个声明的,这是调用自己定义的这个重写的方法,那现在一个问题,那你负类是可以调了,那我接口中现在是不是还有默认方法了,原来的话呢,接口中都是抽样方法,那那不让调,那我也不敢调,反调也没有东西,那现在我们是有方法体的了,那这时候呢,你想一想,我现在还想去调接口中的默认方法。
23:28
怎么调?那你要说我们调的话呢,直接拿这个compare a,我去调method的这个不行,你静态的这个可以点出来,非静态的呢点不出来了。怎么办呀?这呢,你可以看到这个规定了,我们直接通过接口点叫super点,这就可以掉了,你怎么也得给一种方式啊是吧,这个就是compare b点啊叫super,嗯,Compare b点。Super点啊,第二个master这这是可以调的,那就是这两个的话呢,咱们相当于是调用接口当中的这个默认方法,诶就这么着掉的,诶这个的话呢,可以看成是咱们这个三角知识点五啊。
24:21
知识点五相当于呢,就是呃,如何在这个子类或者呢说叫实现类这个的方法中,这个呢,我们去调用这个负类,或者呢是这个接口中。这个被重写的方法,那这呢就是给定了这样的一个方式,尤其是这个咱们原来没有见过,行这呢就说完了,这个说完以后呢,咱们算是关于扎八中的新特性呢,其实也就讲完了,这呢,其实讲的呢是有点细了啊,就是真正咱们要用的时候呢,哪有这么多说这个跟方法名又跟那个又冲突了,冲突了又重突了是吧,咱们这讲的其实呢,就是出现了很多这个极端情况,真正呢,你要用的时候呢,就是我们可能会见到一些API里边会提供一些所谓的这个叫默认方法,静态方法呢,其实见的稍微比较少一些啊,比如说我这种ctrl shift t,看一看这个一个呢叫collection。
25:20
这呢是一个接口了,这个进来这个接口打开它,嗯,这块呢,你我你看这个S这不都是算是静态的是吧。啊,这个collection我写错了啊,我调的是collection shift t,我找的是collection,这个这个collection你看看到以后,嗯,这些呢,这是加一的,还都是作为一个原来说的接口,都是一些抽象方法,然后后边这块呢,我们会看到它有一些这个D,像这些凡是带D的,这都是1.8以后才有的,就是默认方法,那那就是这些方法的话,都会有这个方法体了,那就意味着呢,咱们比如说提供一个具体的这个接口的一个实现类,这个实现类的话呢,通常时候呢,咱们就不去重写了。
26:12
你想想你要还重启,那它定义这个是不是也没意义了,你不又得是个抽象了嘛,它既然没有重启,其实就相当于让你就拿来用了,所以我们平时其实你要用的话呢,也是说我们呢有一个类呢,这个这个实现了你这个接口了,我呢看到你这里边儿有一些默认方法,我就直接用呗,说白了就是我们一定程度上让这个接口呢,越来越像类了。哎,你就知道这个事儿就可以了,哎,就行了啊好,这呢是咱们关于这个,呃,这个扎阿巴里边这个新特性这样的一个解释说明啊,说的呢其实比较细了,大家呢,整个就听一下把最后我说的这样一个事儿呢,你稍微关注一下就行,以后呢,现脑结果中的默认方法,直接你就知道子类这个对象可以直接调就行,哎这个目前呢,静态方法咱们看到的还很少。
我来说两句