Java回调函数讲解
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D(方法C在方法D中),D这个方法就叫回调方法。
举个例子:
有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2。
1 2 3 4 5 6 7 8 9 10 11 | /** * 这是一个回调接口 * */ public interface CallBack { /** * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数 * @param result 是答案 */ public void solve(String result); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /** * 这个是小王 * 实现了一个回调接口CallBack,相当于----->背景一 */ public class Wang implements CallBack { /** * 小李对象的引用 * 相当于----->背景二 */ private Li li; /** * 小王的构造方法,持有小李的引用 * @param li */ public Wang(Li li){ this .li = li; } /** * 小王通过这个方法去问小李的问题 * @param question 就是小王要问的问题,1 + 1 = ? */ public void askQuestion( final String question){ //这里用一个线程就是异步 new Thread( new Runnable() { @Override public void run() { /** * 小王调用小李中的方法,在这里注册回调接口 * 这就相当于A类调用B的方法C */ li.executeMessage(Wang. this , question); } }).start(); //小王问完问题挂掉电话就去干其他的事情了,诳街去了 play(); } public void play(){ System.out.println( "我要逛街去了" ); } /** * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法 */ @Override public void solve(String result) { System.out.println( "小李告诉小王的答案是--->" + result); } } |
这里我提及一下,上面代码里为什么有个线程???答案就是回调函数其实是同步的,如果你不使用线程会发现是同步打印结果,所以那里我们要改为异步调用,所以就使用了线程~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /** * 这个就是小李啦 * */ public class Li { /** * 相当于B类有参数为CallBack callBack的f()---->背景三 * @param callBack * @param question 小王问的问题 */ public void executeMessage(CallBack callBack, String question){ System.out.println( "小王问的问题--->" + question); //模拟小李办自己的事情需要很长时间 Thread.sleep( 8000 ); /** * 小李办完自己的事情之后想到了答案是2 */ String result = "答案是2" ; /** * 于是就打电话告诉小王,调用小王中的方法 * 这就相当于B类反过来调用A的方法D */ callBack.solve(result); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 测试类 * */ public class Test { public static void main(String[]args){ /** * new 一个小李 */ Li li = new Li(); /** * new 一个小王 */ Wang wang = new Wang(li); /** * 小王问小李问题 */ wang.askQuestion( "1 + 1 = ?" ); } } |
结果自行测试啦~就不贴出了,勤动手~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具