您的位置 首页 java

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

难度

初级

学习时间

60分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.类中嵌套接口

我们先来回顾一下类中嵌套接口的样子。

演示:

请定义一个外部类Outer,然后在外部类Outer中定义一个嵌套接口IInner。

代码:

2.类中嵌套接口应用场景

什么情况下我们会在类中嵌套接口呢?

这里我给大家举一个实际案例,为了讲清楚这个案例,我会给大家一步一步讲解,可能有点啰嗦,请大家谅解!

大家都有手机,手机系统比较常见的有IOS和Android。

拿Android手机来讲,因为开发Android应用用的是Java语言,后面我们全栈工程师学习计划也会有相应的教学,持续关注我们就能看到,注意别错过哦。

打开每一个Android应用,它里面都有按钮,下图中红框中的都是按钮:

这些按钮用Java类来表示就是Button:

我们对这个按钮有三种操作:单击、双击和长按。

请大家试想一下:我按了一下按钮,按钮是不是要给我一些反馈?

反馈的意思是:你刚刚的操作是单击?还是双击?还是长按?如果用户单击了按钮,则系统会反馈给开发者用户刚刚单击了按钮;如果用户双击了按钮,则系统会反馈给开发者用户刚刚双击了按钮;如果用户长按了按钮,则系统会反馈给开发者用户刚刚长按了按钮;

好,再试想一下:按钮怎么给我反馈?我怎么接收它给我的反馈?

有人想到说通过方法来反馈。好,如果我们直接在按钮类Button里面定义一些方法,这里就只演示单击和长按:

然而通过这种做法并不妥,为什么?

单击按钮或者是长按按钮做的事情是不一样的,视频的播放按钮单击之后是触发播放视频;“关注”按钮点了之后是关注某位作者;“点赞”按钮单击效果和长按效果是不一样的,单击一下是赞,再单击一下是取消赞,长按是连击并飞出各种表情。我们怎么能在Button类的一个click()方法和longClick()方法里面写完呢?根本不可能,也不合理。应该把这个方法具体实现交给开发者来做,实现不同的效果。

好,到这里,有人可能想到:这个click()方法和longClick()方法必须得抽象啊,不应该有具体实现。方法都抽象了,类也必须得抽象。

但是,这里的按钮类Button是一个实实在在的对象,怎么说呢?它已经是一个实际存在的对象,不能再被抽象。你要是说把按钮、开关按钮、单选按钮和复选框抽象一下还是可以的,按钮已经具体到不可再抽象的地步,不能再被抽象。那这样的话,click()方法和longClick()方法就没法被抽象了,怎么办呢?

有一个办法,把这两个方法放进内部类里面或者是嵌套接口里面。因为点击或者长按属于按钮自身的一个操作,你是单击还是双击还是长按只有按钮知道,所以尽量使用可以定义在类中的元素。这个时候给我们的选择只有 内部类、抽象内部类、静态内部类、静态抽象内部类、嵌套接口。

我们来做排除法,首先,click()方法和longClick()方法得是抽象的,所以内部类和静态内部类不合适。那就剩下 抽象内部类、静态抽象内部类和嵌套接口。

最合适的是采用 嵌套接口 。下面说说原因。

这里有一条宝贵经验分享给大家: 类负责实现,抽象类负责实现公共部分的实现,接口负责连接更多不同的类。

大家想想,除了按钮可以点击以外,还有什么可以点击的?图片可以点击、文字可以点击、链接可以点击、单选按钮可以点击,很多东西都可以点击。图片、文字、链接和单选按钮它们都可以用类来描述。既然它们都可以点击,那么我们把它们公共部分抽取出来,用公共部分将它们连接起来,上面刚刚说过的经验里面讲到 用接口来连接更多不同的类。

再一个,当我们使用了抽象内部类和静态抽象内部类后,由于Java中类只能单继承,不能多继承,后面肯定还会有更多的麻烦。而接口就不存在这个问题,所以采用嵌套接口这种方式再合适不过。

于是呢,我们的点击事件嵌套接口就诞生了。但还是不妥,怎么不妥呢?我们来看OnClickListener嵌套接口:

它里面有两个抽象方法,一个反馈单击的,一个反馈长按的,意味着用户点击按钮之后,我得不到明确的反馈,你到底反馈给我单击还是长按?

于是,我们还得完善,得把两个抽象方法分别放置到各自的嵌套接口中去:

好,看似很完美了。好像还是差点什么,用户点击按钮,按钮得有个地方来告诉开发者。

通过什么方式来告诉开发者呢?

如果按钮持有这两个嵌套接口引用就好了,当用户点击按钮时,使用点击事件嵌套接口引用调用其click()方法通知开发者;当用户长按按钮时,使用长按事件嵌套接口引用调用其longClick()方法通知开发者。

引用的对象怎么来呢?

引用的对象让开发者传给按钮类。

我们先来这样做,然后再来解释为什么要这样做:

简单的分析一下程序,Button类中有两个嵌套接口的引用,分别是点击事件和长按事件:

作用不多说,就是为了通知开发者执行对应的操作,比如点击了按钮执行什么操作。

紧接着,就是让开发者有个入口可以传递进来自定义实现:

你只需要传递进这两个接口的实现即可。

写了这么多,我们还没实际体验一下这个类,接下来,就来体验一下这个类。在体验之前,我们还需要在Button类里面写两个模拟点击和长按的方法。

担心上图太小,大家看不清。单独把这两个方法提出来看看:

接着,我们去Main类main()方法创建出一个按钮对象:

紧接着,我们需要设置按钮的点击事件和长按事件:

简单的分析一下程序,点击事件和长按事件需要被实现才能创建对象,所以我们采取前面所学过的静态内部类方式来实现:

为什么是静态内部类?因为main()方法是静态的,它只能访问到静态成员。

有了这两个静态内部类之后,接下来创建其对象,然后设置到按钮类中去,这样按钮类就持有了这两个对象:

下面,我们开始模拟点击按钮和长按按钮,看是否能和预期的一样,触发点击事件和长按事件:

运行程序,执行结果:

各位,梦想已成真。和我们预期的一样,用户点击按钮,按钮给我们反馈,反馈对应的具体操作由我们自己自定义。

收获一:回调

恭喜你,第一次使用到回调。

什么叫回调?

在Java中,回调是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象。

此例中,MyClickListener和MyLongClickListener两个类都是回调类。

clickListener和longClickListener是回调对象。

click()方法和longClick()方法都是回调方法。

回调方法一般都是被动触发。就像此例中我们在main()方法里调用了button对象的mockClick()方法:

mockClick()方法里调用了onClickListener对象的click()方法:

而onClickListener引用类型是嵌套接口:

所以会去执行实际被实现的方法,也就是实现类MyClickListener里面的click()方法:

OnClickListener的实现类是MyClickListener,所以会调用MyClickListener类里面的click()方法。

和最终执行的结果一样:

收获二:匿名内部类

咦?我们没有使用到匿名内部类啊,怎么会有收获呢?

别急,这就来匿名内部类,可能对于新手同学来说,前面的教学文章的确还没讲到匿名内部类,这里简单的提一下,后面会有详细的讲解。

我们可以使用匿名内部类替换掉静态内部类:

运行程序,执行结果:

和静态内部类的执行结果一致,但相比较而言,程序变得更加简洁,提高了阅读性。这就是匿名内部类的简单用法,不会的同学不要着急,后面马上会讲解到匿名内部类。

收获三:lambda表达式

同样的,我们还没有学过lambda表达式呢,而且不会又是可以替代匿名内部类的吧?

是的,lambda表达式会让匿名内部类变得更简洁:

运行程序,执行结果:

和之前静态内部类和匿名内部类执行结果一样,但程序变得比之前还要简洁,提高了阅读性。

还有比lambda表达式简洁的吗?

哈哈,没了,暂时就是lambda表达式最简洁。

收获四:Android官方源码写法

虽然Android我们还没学到,但还是可以提前来看一下Android官方中Button类源码是怎么写的:

然后我们看一下它里面有没有一个设置点击事件的方法:

各位,看到了吗?是不是和我们写的一样?它也有OnClickListener接口和setOnClickListener()方法,只不过该接口给抽取到公共类View里面去了,这样图片、文字和按钮都向上继承,直到View,就都可以享受到setOnClickListener()方法。

好,来看看View里面的OnClickListener接口和setOnClickListener()方法:

上面是OnClickListener接口,它里面有一个onClick()方法,我们的是click()方法,名字不同而已。

上面是setOnClickListener()方法,我们是不是也写过。

上面是setOnLongClickListener()方法,我们也写过。

上面是OnLongClickListener接口,我们也写过。

附:Andorid官方Button类链接地址

总结

  • 类中嵌套接口的应用有很多,包括像很多框架中被大量运用。
  • 一般地,当一个事物存在与另一个事物里面时,则可以将其定义在另一个事物的内部,这样运用的知识点就是内部类(包括其他内部类)和嵌套接口。

至此,Java中类中嵌套接口的应用场景相关内容讲解先告一段落,更多内容请持续关注。

附:接口学习资料

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

下一章

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

文章来源:智云一二三科技

文章标题:“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

文章地址:https://www.zhihuclub.com/192377.shtml

关于作者: 智云科技

热门文章

网站地图