Java中回调函数详解
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中回调函数详解相关推荐
- Java中Math函数详解
Java中Math函数的使用 算术计算 Math.sqrt() :计算平方根 Math.cbrt() : 计算立方根 Math.pow(a, b) : 计算a的b次方 Math.max( , ) : ...
- java 中indexOf函数详解
最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下. private static int indexOf(String source, St ...
- Java 回调函数详解及使用
Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...
- 函数指针与回调函数详解
函数指针与回调函数详解 1.什么是函数指针? 函数(的)指针就是指针.这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址.这类似于数组名就是数组的首地址.我们可以通过反汇编直观的查看到函数 ...
- Java中JDBC连接数据库详解
今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...
- Matlab中 pdist 函数详解
学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...
- c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...
- JAVA中的Random详解
JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...
- java中new关键字详解
java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...
- matlab中xcorr函数详解
Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...
最新文章
- 2022-2028年中国铅锌精矿粉行业市场研究及前瞻分析报告
- [How TO]-python venv虚拟环境
- mysql空间是什么格式_MySQL数据类型 - 空间数据类型 (6)
- linux管理员权限命令_每个系统管理员应该知道的20个Linux命令
- 计算机按键喀秋莎,给自己的小家配置一台巫喀秋莎桌面hifi音响
- python全文检索框架_全文检索框架haystack和搜索引擎whoosh的使用
- Java 会是未来第一编程语言吗?
- matlab傅里叶光学仿真,关于微透镜阵列的傅里叶光学分析
- 基于51单片机+DS1302时钟模块+LCD1602显示
- think-cell中类别或系列标签在多个图表中未对齐
- 小学生十大计算机专业书排行,小学教辅十大排行榜2018 小学教辅书那些比较好...
- 非常规方法彻底删除System Volume Information.exe
- ur3手眼标定+realsenseL515
- 【英语:基础进阶_读写专项训练】G3.记叙文写作
- 量子计算 8 量子纠缠
- 生信识图之 点图进阶-6(UMAP)
- c语言编译器能不能找出逻辑错误,《C Primer Plus》- 第二章 C语言概述
- web服务器--基于同一IP的不同端口访问不同网站
- 【面试真题】这两个命令难坏了一帮小伙伴
- 图神经网络让谷歌地图更智能
热门文章
- U盘文件夹乱码无法删除的原因及解决方案
- lbochs模拟器最新版_手机模拟器电脑模拟器-bochs模拟器安卓版下载 v2.6.8-都去下载...
- 将GitHub源代码打包成jar包
- 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
- android系统签名一样不,解决Android应用签名和系统不一致的问题
- Processing自画像
- pin与抓握手包破解wifi密码
- linux fcntl函数,Linux C 学习之 - fcntl 函数
- meta分析-stata软件使用
- Python scrapy 将mmjpg图片下载到本地