Java调用分为3种:同步调用,同步回调,异步回调
  1.同步调用及平时常用的调用方式
  2.回调在框架中使用较多,例如spring 的 AOP实现,servlet的拦截器实现
  场景 老师布置完作业后提供一个回调方法,学生可以通过这个方法把执行情况汇报给自己的老师。
  (回调使用的重点,不同的老师实现相同的回调接口,但是会有不同的实现,因此学生可以选择自己老师来进行汇报,这也是AOP通过反射调用相关方法的原理)
  Java 模拟 : class A 实现一个接口 ,class B 调用接口 的方法 从而实现对class A 的调用
  回调接口
  public interface Callback {
  public void taskResult(String name);
  }
  老师1实现回调接口
  /**
  * 学生必须知道老师的信息,才能回报任务情况,因此它必须实现回调接口
  *
  */
  public class Teacher1 implements Callback{
  @Override
  public void taskResult(String name) {
  // TODO Auto-generated method stub
  System.out.println(“任务:”+name+”完成”);
  }
  }
  学生执行任务,并使用回调方法汇报给老师
  public class Student {
  Callback callback= null;
  //将老师的联系信息给学生
  public void setCallback(Callback callback)
  {
  this.callback=callback;
  }
  public void doTask()
  {
  for(int m=1;m<6;m++)
  {
  callback.taskResult(m+”是张三”);
  }
  }
  }
  测试类:
  public class CallbackTest {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  Student student=new Student();
  //指定学生对应的老师
  student.setCallback(new Teacher1());
  student.doTask();
  }
  }
  可以看到学生在执行完任务后,会调用对应老师的回调方法
  3.异步回调:异步回调会新建一个线程执行回调的同时继续进行接下来的任务
  场景:小王要问小李一个问题,小李思考答案的同时小王继续做自己的事情,在小李得到答案后调用小王的回调方法,通知小王答案。(同样注意的是 不同的小王有不同的回调函数,会执行不同的操作)
  回调函数接口:
  public interface CallBack {
  /**
  * 这个是小李知道答案时要调用的函数告诉小王,也是回调函数
  * @param result 是答案
  */
  public void solve(String result);
  }
  小王实现回调函数的类,小李在得到答案后会调用小王的回调方法通知小王:
  /**
  * 这个是小王
  * @author xiaanming
  * 实现了一个回调接口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);
  }
  }
  小李:
  public class Li {
  /**
  * 相当于B类有参数为CallBack callBack的f()—->背景三
  * @param callBack
  * @param question 小王问的问题
  */
  public void executeMessage(CallBack callBack, String question){
  System.out.println(“小王问的问题—>” + question);
  //模拟小李办自己的事情需要很长时间
  for(int i=0; i<10000;i++){
  }
  /**
  * 小李办完自己的事情之后想到了答案是2
  */
  String result = “答案是2”;
  /**
  * 于是打电话告诉小王,调用小王中的方法
  * 这相当于B类反过来调用A的方法D
  */
  callBack.solve(result);
  }
  }
  写一个测试类:
  public class Test {
  public static void main(String[] args) {
  Li li = new Li();
  Wang wang = new Wang(li);
  wang.askQuestion(“1 + 1 = ?”);
  }
  }