说说什么是回调

同事问我,到底Java里面什么是回调,该如何使用回调,看来还是有很多人没理解回调的概念。
首先,回调函数是什么,维基百科的解释是,通过函数参数传递到其它代码的,某一块可执行代码的引用。
In computer programming, a callback is a reference to executable code,
or a piece of executable code, that is passed as an argument to other
code.
我们用一个典型的回调例子来说明

package callback;

/**
 * @author lhq
 */
public interface CallBack {
    public void onCallBack();
}

首先是用于回调的接口,我们在接口里面定义了一个方法,叫onCallBack();

/**
 * @author lhq
 */
public class A {
    private CallBack aCallBack;

    public void setCallBack(CallBack callBack) {
        this.aCallBack = callBack;
    }

    public void excute(){
        aCallBack.onCallBack();
    }
}

其次是类A,里面有一个方法setCallBack(CallBack callBack),传入一个CallBack接口的实现对象,并且定义了一个私有的属性aCallBack来接收这个对象。还有一个方法excute(),在这个方法里调用了aCallBack的onCallBack()方法

/**
 * @author lhq
 */
public class B {
    public static void main(String[] args) {

    CallBack bCallBack = new CallBack() {

            @Override
            public void onCallBack() {
                System.out.println("我是回调函数");
            }
        };

        A a = new A();
        a.setCallBack(bCallBack);
        a.excute();
    }
}

最后是类B,在这个类的main函数里面,new出了A的一个实例a和接口CallBack的一个实现 bCallBack,并且让bCallBack的onCallBack()方法打印字符串“我是回调函数”。然后执行a的excute()方法。
此时,运行类B的主函数,会发现控制台上输出“我是回调函数”。

我们来分析一下这个例子
看类B,main函数执行的时候,首先执行了代码

CallBack bCallBack = new CallBack() {

            @Override
            public void onCallBack() {
                System.out.println("我是回调函数");
            }
        };

这段代码的意思是,在内存里创建了一个CallBack的对象,这个类的onCallBack()方法会在控制台输出字符串“我是回调函数”,然后,将这个对象的引用赋给了参数bCallBack. 如图:
这里写图片描述
随后,执行了代码

A a = new A();
a.setCallBack(bCallBack);

setCallBack(bCallBack)方法中执行了操作

public void setCallBack(CallBack callBack) {
        this.aCallBack = callBack;
    }

我们要理解一点,方法的参数传递的是对象的引用,也就是说,当我们执行setCallBack方法时,我们将bCallBack持有的对象的引用传递给了a对象的aCallBack属性。如图:
这里写图片描述
也就是说,此时,A类的实例a中的aCallBack属性,其实持有的是之前new出来的bCallBack所指向的对象,于是当我们执行a.excute()方法

public void excute(){
        aCallBack.onCallBack();
    }

时,执行的就是B类里面new出来的CallBack对象的方法。
回到之前对于回调的定义:通过函数参数传递到其它代码的,某一块可执行代码的引用。
现在看起来是不是直观多了,通过a.setCallBack(CallBack callBack)方法,将B类中创建的对象的引用传递到a中,然后a就能通过这个引用执行该引用对应的对象所实现的方法或者说代码。

以上就是我对回调的理解,如果有错漏的地方,欢迎指出,感激不尽

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值