这几天朋友在找工作,打电话问了我一些面试意见和可能会问到的问题,其中说到,回调,他虽然也在用,也看了不少解释,就是不知道到底要怎么去解释这个回调。
所以今天,我也谈谈回调,给一个最简洁的小例子。
其实,个人理解的回调就是,
1.需要有两个类(调用者与被调用者,只是这两个类的调用关系比较暧昧)
2.A调用B,让B去完成某个任务
3.但B如果要完成这个任务,需要调用A的一个方法协作(这个方法,就是回调方法)
4.B成功调用了A的方法协作,B最终顺利完成了任务
本例的情景是这样的:
A问B:某个数的10次方是多少?
B开始作答,但是他要先问A:这个数是多少?
A说:是10
B给出了答案
下面来看代码:
主角有三:
1.接口CallBack类(回调方法)
2.A类(任务的发起者)
3.B类(任务的执行者)
1.首先是接口CallBack:
public interface CallBack {
// 回调方法,本例的主角
float doCallBack();
}
2.其次是任务发起者A类:
public class A implements CallBack {
//A中的方法,参数是B类,该方法中调用B的方法
public void AaskB(B class_b) {
System.out.println("A开始问B问题: 某个数的10次方是多少?");
//调用B的方法
class_b.BanswerA(this);
}
//回调方法,这里抽出来写,也可以直接把上面的参数this改为直接new CallBack()直接写
@Override
public float doCallBack() {
System.out.println("(A中的回调方法),A说,这个数是 2");
return 2;
}
}
3.最后是任务执行者B类:
public class B {
// B中唯一的方法,被A调用了,这个方法的参数是A中的 回调函数
public void BanswerA(CallBack callback) {
System.out.println("B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数");
// 调用类A中的回调方法
// 然后回答
// (这里两步并作一步写)
System.out.println("B接收到A说的数,给出了答案" + Math.pow(callback.doCallBack(), 10));
}
}
好了,大功告成:
让我们来写个测试类Test试试:
public class Test {
public static void main(String[] args) {
A classA = new A();
B classB = new B();
classA.AaskB(classB);
}
}
控制台的输出结果:
A开始问B问题: 某个数的10次方是多少?
B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数
(A中的回调方法),A说,这个数是 2
B接收到A说的数,给出了答案1024.0
如果还觉得不够直观。
那我们可以把他们稍作改造,全部简写在一个类中
//A类
public class A {
//接口
public interface CallBack {
void doCallBack();
}
//A中的方法,调用B
public void AaskB(B class_b) {
class_b.BanswerA(new CallBack() {
@Override
public void doCallBack() {
System.out.println("(A中的回调方法),A问B -- >B问A");
}
});
}
//B类,就一个方法(参数是接口)
public static class B {
public void BanswerA(CallBack callback) {
callback.doCallBack();
}
}
//测试类
public static class Test {
public static void main(String[] args) {
A classA = new A();
B classB = new B();
classA.AaskB(classB);
}
}
}
执行,控制台输出:
(A中的回调方法),A问B -- >B问A
可以看到,虽然代码大量简写(省略了一些System.out),但是主要的核心思想,”回调”这个步骤还是展现出来了
测试中,A只是执行了问B的方法,控制台输出的 却是A类中的这个回调方法中的执行逻辑。
充分体现了,A问B,B问A,B再执行完毕。这个过程
好了,献上我的源码Demo源码
分成四个类写的: http://download.youkuaiyun.com/detail/lebang08/9649587
极简版: http://download.youkuaiyun.com/detail/lebang08/9649630