您的位置 首页 java

“全栈2019”Java第一百一十三章:回调详解和回调应用场景详解

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

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

1.回调

我们先来看Java中回调的定义:

回调是通过接口或 抽象类 来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,回调类里面的方法称为回调方法。

接下来通过一个例子来解释上面的定义。虽然这个例子在之前文章出现过,但那时不是为了说明回调这个知识点,而是为了说明类中嵌套接口的应用场景。感兴趣的同学可以前去阅读一下:

这里简单地复述一遍例子。

大家请看,上面两个图标应该不陌生,一个是收藏,一个点赞。这两个图标都可以点击,换言之,这两个图标实际上是两个图标按钮,图标按钮就是只有图标没有文字的按钮,属于按钮的一种。

好了,说完了按钮,接着说说按钮的功能,按钮的功能就是可以被点击,用类来描述一下:

我们先去Main类main()方法中测试一下按钮类中的点击方法:

运行程序,执行结果:

从运行结果来看,程序编写没有问题。

但是,逻辑好像有点问题,什么问题呢?

这是点赞按钮对吧,那收藏按钮呢?

好,根据问题,我再创建一个收藏按钮:

运行程序,执行结果:

从运行结果来看,程序本身写得没有问题,但是结果有点问题,怎么两个都是点赞呢?说好的收藏呢?

那是因为你把点击按钮方法内部执行语句写死了:

再创建一百个按钮都是点赞。那肯定不行啊,这逻辑就有问题啊,这个点击按钮之后触发的操作肯定不是写死的,肯定是自定义操作的。所以说click()方法是一个 抽象 方法:

因为click()方法是一个抽象方法,有抽象方法的类一定是一个抽象类,所以Button类就是一个抽象类。

看似很美好,但是,这里就不对了,怎么不对了?这不挺好的吗?点击方法随意子类去定义。

是,点击方法是可以让子类自定义,但是Button类已经是一个不可再抽象的类了,它已经是一个具体的对象了,它可以被继承,但是不能被抽象。怎么说呢?按钮、图片、文字它们都可以被点击,它们可以向上抽取,抽取出一个视图(View)类,将点击方法放在其中。但这些类都不能再被抽象,它们只能向上抽取。

刚刚我们说按钮可以被继承?什么情况下会被继承?

比如图标按钮、文字按钮、链接按钮等等这些,都可以继承按钮。

那这些按钮都有共性,为什么不能将Button作为抽象类?

因为Button作为一个普通按钮,它就像一根木头,看得见摸得着,木头你可以做出椅子、凳子和桌子。那我只要木头可以吗?当然可以了,又不是非得把木头做成椅子。同样的,我只要一个按钮可以吗?也是可以的。你可以只创建出一个最普通的按钮,你也可以创建出图标按钮和文字按钮,图标按钮就在按钮基础之上加上图标;文字按钮就在按钮基础之上加上文字;按钮可以独立存在。

说完了Button不能被抽象,那么它里面有抽象方法怎么办?

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

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

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

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

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

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

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

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

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

引用的对象怎么来呢?

引用的对象让开发者通过方法传给按钮类。

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

第一个红框:

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

第二个红框:

作用就是让开发者有个入口可以传递进来自定义实现。你只需要传递进点击事件接口的实现即可。

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

好,接下来就是Main类:

运行程序,执行结果:

从运行结果来看,程序没有问题,结果也符合预期。

我们慢慢来分析分析该例子,来看看Main类中的main()方法:

这一步,创建了点赞按钮对象,继续往下执行:

这一步,设置了点击事件,实参是一个匿名内部类,该匿名内部类实现了按钮的点击事件接口,里面的抽象方法实现的是点击点赞按钮之后的操作:

接下来,继续往下执行:

这一步,创建了收藏按钮,继续往下执行:

这一步,设置了收藏按钮的点击事件,里面的onClick()方法就是当收藏按钮被点击之后所触发的操作:

好了,继续往下执行:

这一步,我们模拟点击点赞按钮,触发了Button对象里面的mockClick()方法:

mockClick()方法内部使用OnClickListener点击事件接口引用调用其onClick()点击方法,实际调用的是OnClickListener点击事件接口实现类里面的onClick()点击方法:

执行结果:

好了,继续往下执行:

同理,我们模拟点击收藏按钮的过程和模拟点击点赞按钮过程是一样的,所以就不再赘述,请大家理解。

好了,到这里为止,程序执行完毕!例子算是讲解完毕!

大家可能要骂人了,说好的回调呢?各位,别急别急,现在就来了。

我们再来看看回调的定义:

回调是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,回调类里面的方法称为回调方法。

一句一句根据实际案例讲解回调。

第一句: 回调是通过接口或抽象类来实现的

对应我们案例中就是OnClickListenner嵌套接口:

第二句: 我们把实现这种接口的类称为回调类

因为我们例子中都是使用匿名内部类来实现的,不方便大家观看到什么叫做回调类,所以我又改写了一下程序,为了让大家看到更清楚:

红框中的LikeButtonClickListener就是回调类,它实现了回调接口。

第三句: 回调类的对象称为回调对象

对应例子中的:

红框中的就是回调对象,千万别搞错了!!!

前面的likeButtonClickListener是引用,likeButtonClickListener前面的是引用类型,千万要记住哦!

第四句: 回调类里面的方法称为回调方法

对应我们例子中的:

红框中的onClick()方法就是回调方法。

到这里,回调讲解完毕,你学会了吗?如果还有疑问或者是觉得我没有讲解清楚的地方,欢迎大家在评论区留言,我会根据大家的问题再作解答!请大家谅解!谢谢!

总结

  • 回调是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,回调类里面的方法称为回调方法。

至此,Java中回调相关内容讲解先告一段落,更多内容请持续关注。

答疑

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

上一章

下一章

本章为《“全栈2019”Java基础》最后一章,接下来是《“全栈2019”Java异常》。

学习小组

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

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

全栈工程师学习计划

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

版权声明

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

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

文章标题:“全栈2019”Java第一百一十三章:回调详解和回调应用场景详解

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

关于作者: 智云科技

热门文章

网站地图