Java的中回调函数详解

0.前言

恕我直言,网上的blog大多数都是抄袭。而且参考价值不高。于是有了写本博文的想法。

1.背景

看到网上一个blog,讲得例子挺好,打电话那个也太俗套了嘛。这里我就以该blog中的例子,详细介绍一下我理解的回调函数。

2.定义

这里说出我所认为正确的定义【如果有道友不赞同,请不吝指正】:
在A类中调用B类中的方法c【实现这个很简单,比如说:直接在A类中使用类B对象的b.method()即可】,然后B类反过来调用A类的方法D,这个方法D就叫做回调方法。
实现过程如下:

  • 定义一个接口CallBack【定义这个接口的目的在于抽象】
  • Class A实现接口CallBack
  • Class A中包涵一个类B的引用b
  • Class B中有一个方法f,它的入参有CallBack类对象callback;如f(CallBack callBack,String …)
    所以整个过程的调用关系就是:b.f => ··· => callBack.method => a.method【由b.f调用 callBack的method方法之前,我使用的符号是 => ··· =>,这就代表,调用回调函数可能不是一步完成的,中间可能有许多间接的其它函数调用】

3.需求

微信充值话费相信大多数同志都有经历,通常需要如下几个步骤:

  • 01.首先微信客户端调用服务器的接口进行充值操作,
  • 02.但是服务器端需要完成的内容就比较多了,比如:银行完成转账,运营商进行充值等;如果需要一直等待【同步】服务器端完成这个操作,就需要花费很长的时间;但是如果采取异步就不会有这个问题。于是这个过程就采用异步手法。
  • 03.在手机上完成微信充值之后会收到充值成功的界面,但是实际上充值并未成功【只是显示微信缴费成功而已】。
  • 04.实际的成功【比如说10001给你发短信才表示实际充值成功】,那么这个发短信提示的功能就可以使用回调实现。
    上述这个过程,如果需要使用Java该怎么实现呢?

4.代码

  • CallBack接口
/*** 1.CallBack is only an interface. And have a simple method.*/
public interface CallBack {public void notifyToUser();
}
  • WeChat类
package wechat;/****/
public class WeChat implements CallBack{public String weChatId;//wechat idpublic String name;//实际用户名public double money;//充值金额public Server server = new Server();//维持一个Server的引用public WeChat(String name,double money){this.name = name;this.money = money;}public void pay(){//充值System.out.println("01. 微信客户端接到用户"+this.name+"充值的请求,准备调用方法payToTelecom,进行充值:");server.payToTelecom(WeChat.this);//将自己【WeChat这个对象传入参数中】System.out.println("05. 充值成功消息已通知用户,payToTelecom()调用完毕");}//实现Callback中通知用户的方法@Overridepublic void notifyToUser() {System.out.println("04. 尊敬的客户,您已成功充值100元。" +"查询余额请直接回复102、登录欢go网站(www.189.cn)、欢go客户端。[中国电信上海公司]");}
}
  • Server类
package wechat;public class Server {public void payToTelecom(WeChat weChatUser){//给中国移动支付System.out.println("02. 向中国电信为用户:"+weChatUser.name+"支付"+weChatUser.money+"元");System.out.println("03. 收取客户:"+weChatUser.name+" 0.1%的手续费");this.notifyToWeChat(weChatUser);}public void notifyToWeChat(WeChat weChatUser){weChatUser.notifyToUser();}
}
  • TestMain类
package wechat;public class TestMain {public static void main(String[] args) {WeChat weChat = new WeChat("LittleLawson", 100);weChat.pay();}
}

上述代码可在如下链接https://github.com/LittleLawson/TestCallBack中获取,在代码中,我添加了一个AliPay类,用于体现接口CallBack并非多余。

4.分析

上述代码的调用过程如下:
weChatUser.pay() => server.payToTelecomByWeChat() => server.notifyToWeChat() => weChatUser.notifyToUser()
可以看到最开始由WeChat.pay()出发,最后回到weChatUser.notifyToUser()方法【注意他们都是WeChat这个类中的方法】,故称回调。

5.总结

想必还在思考回调函数的实现过程的各位同学和我一样——还是Java入门者。这里我抛出几个问题,大家可以思考一下:

  • 01.为什么需要回调函数?
    我认为,回调函数的存在就是为了告诉调用者“我调用成功/失败了”。比如说上述的微信充值例子,如果不知道自己是否充值成功/失败,那要微信有个鸟用?【充值成功/失败的标准是:运营商收到这笔钱,而不是微信收到,所以需要Server这个类触发回调,而不是WeChat这个类触发回调。】

  • 02.经典的回调函数调用的使用案例有哪些?
    这个我正在收集,后期会更新出来。

6.参考资料

  • https://blog.csdn.net/xiaanming/article/details/8703708/【好文章】

  • https://www.cnblogs.com/liboBlog/p/7107440.html【本文素材源自于此】

  • https://blog.csdn.net/jiayi_yao/article/details/51046526【对回调函数的理解正确,而且讲解了为什么需要将notifyToUser()这个方法抽象成单独的CallBack接口中。】

  • https://blog.csdn.net/allen_zhao_2012/article/details/8056665#commentsedit【不过我认为在这篇文章中,该作者对回调的理解是错误的】

Java中回调函数详解相关推荐

  1. Java中Math函数详解

    Java中Math函数的使用 算术计算 Math.sqrt() :计算平方根 Math.cbrt() : 计算立方根 Math.pow(a, b) : 计算a的b次方 Math.max( , ) : ...

  2. java 中indexOf函数详解

    最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下. private static int indexOf(String source, St ...

  3. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  4. 函数指针与回调函数详解

    函数指针与回调函数详解 1.什么是函数指针? 函数(的)指针就是指针.这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址.这类似于数组名就是数组的首地址.我们可以通过反汇编直观的查看到函数 ...

  5. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  6. Matlab中 pdist 函数详解

    学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...

  7. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  8. JAVA中的Random详解

    JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...

  9. java中new关键字详解

    java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...

  10. matlab中xcorr函数详解

    Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...

最新文章

  1. 2022-2028年中国铅锌精矿粉行业市场研究及前瞻分析报告
  2. [How TO]-python venv虚拟环境
  3. mysql空间是什么格式_MySQL数据类型 - 空间数据类型 (6)
  4. linux管理员权限命令_每个系统管理员应该知道的20个Linux命令
  5. 计算机按键喀秋莎,给自己的小家配置一台巫喀秋莎桌面hifi音响
  6. python全文检索框架_全文检索框架haystack和搜索引擎whoosh的使用
  7. Java 会是未来第一编程语言吗?
  8. matlab傅里叶光学仿真,关于微透镜阵列的傅里叶光学分析
  9. 基于51单片机+DS1302时钟模块+LCD1602显示
  10. think-cell中类别或系列标签在多个图表中未对齐
  11. 小学生十大计算机专业书排行,小学教辅十大排行榜2018 小学教辅书那些比较好...
  12. 非常规方法彻底删除System Volume Information.exe
  13. ur3手眼标定+realsenseL515
  14. 【英语:基础进阶_读写专项训练】G3.记叙文写作
  15. 量子计算 8 量子纠缠
  16. 生信识图之 点图进阶-6(UMAP)
  17. c语言编译器能不能找出逻辑错误,《C Primer Plus》- 第二章 C语言概述
  18. web服务器--基于同一IP的不同端口访问不同网站
  19. 【面试真题】这两个命令难坏了一帮小伙伴
  20. 图神经网络让谷歌地图更智能

热门文章

  1. U盘文件夹乱码无法删除的原因及解决方案
  2. lbochs模拟器最新版_手机模拟器电脑模拟器-bochs模拟器安卓版下载 v2.6.8-都去下载...
  3. 将GitHub源代码打包成jar包
  4. 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
  5. android系统签名一样不,解决Android应用签名和系统不一致的问题
  6. Processing自画像
  7. pin与抓握手包破解wifi密码
  8. linux fcntl函数,Linux C 学习之 - fcntl 函数
  9. meta分析-stata软件使用
  10. Python scrapy 将mmjpg图片下载到本地