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 = ?"); 
    

结果自行测试啦~就不贴出了,勤动手~

posted @   47号Gamer丶  阅读(374)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示