从字面上理解就是,我调用你的方法,你反过来又调用我的方法,就是你来我往。而你反过来又调用我的方法通常称之为回调函数,放在一个专门的接口里面,需要回调机制的类就需要实现这个接口,而且在我调用你的方法的时候,需要把我传递给你,你再通过传递给你的我来调用我的回调函数。
interface CallBack {
void callback(int a);
}
class Me implements CallBack {
private You you;
public Me(You you) {
this.you = you;
}
public void methodA() {
System.out.println("现在我要调用你的方法了");
System.out.println("正在调用B方法");
you.methodB(this);//因为是回调,我必须把我自己传给你,你执行完B方法后
//才能通知我,因此这里必须传this。如果传的是其他CallBack接口的实现类
//那么就不是回调了,是委托。
//回调的核心就是这个this
}
@Override
public void callback(int a) {
System.out.println("我知道你给我反馈的结果了啊,是这个" + a);
}
}
class You {
public void methodB(CallBack c) {
System.out.println("正在执行B方法");
System.out.println("B方法调用结束");
System.out.println("“我回调你了啊”,你说");
c.callback(3);//调用的结果通过参数传递给调用方,即我
}
}
我调用你,我就是上层应用,你就是下层应用,上层可以随意调用下层的函数,但是下层是不能调用上层的,回调函数是下层唯一能够调用上层的函数。
有的地方说,为了使API可以调用自己写的函数,通过使用暴露接口的方式,说这是一种回调,个人觉得这并不是回调。说为了让自己的API更完美,允许某个函数由自定义实现,只需要定义好相关接口,自定义实现的部分属于高层,而这种实现允许底层调用高层的实现,增加了灵活性云云。这种说法只是涉及到了调用,并不是回调。或者可以说将工作流中的某个功能,按照约定的接口暴露给外部使用者,由外部使用者自定义实现。