难度
初级
学习时间
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学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!