我们知道,任何语言都存在着方法的调用,常见的方法调用就是在一个方法a中调用另一个方法b,如果方法b执行时间很短(很短到底有多短?很短是什么意思?很短的意思也就是说方法b中没有开启线程,没有耗时的操作,意思就是方法b是普通的代码执行,如赋值语句,相加返回等这些平常的语句)那么我们就把这种给调用称为同步调用,相反,如果方法b中开启了线程或者存在耗时操作,那么这就是异步调用,异步调用之后方法a和方法b在进程的控制执之下轮流交替执行(希望你们能明白我所说的轮流交替执行),至于方法b执行完之后要不要返回结果给方法a,这就是另外一个问腿了,这个问题就是异步加回调,等有时间我再讲解。今天暂时先写几个Demo来让大家明白java回调,就是我们有讲明白但是你们可以通过这些Demo慢慢去理解。

Demo 1:老师和学生。课堂上老师(假如是数学老师)挑学生(假如是Bob)回答一个很难的数学问题,告诉Bob做出来之后告诉他,然后就去板书了,Bob拿到问题思考了半天,心里很着急,心想我得赶紧做出来啊,要不然老师板书完了还没做出来那就死定了,终于在大半天的冥思苦想之后终于得到答案,然后告诉了老师,得到了老师的夸奖。

下面我们就来实现这个程序:

//首先我们定义一个老师接口,他们有自己的教学任务,我们暂且给他们定义来一个教学任务:提问
//当学生得到答案之后要告诉老师啊,所以这里定义一个学生叫醒老师告诉他答案的方法
interface Teacher{
	public void askQuestion();
	public void tellAnswer(int answer);
}
//因为是数学课,我们让数学老师实现Teacher接口
class MathTeacher implements Teacher {
	//因为问的对象是学生,所以必须拿到学生的句柄才能操作他们。有的同学始终不明为什么要拿到学生
	//的句柄,因为不拿到他们,老师就没办法和学生产生交互,自然也就不存在交互,回调什么的了。
	private Student student;
	public MathTeacher(Student student) {
		this.student=student;
	}
	public void askQuestion() {
		System.out.println("Bob,你计算一下18+32等于几");
		//this代表当前的数学老师,也可以写成MathTeacher.this
		//老师问完问题就调用学生的方法让他解决去了
		student.resolveQuestion(this,18,32);
	}
	//回调方法,老师告诉所有的学生你们相处答案之后要这样说:"老师,我得出了答案,18+32="+answer
	public void tellAnswer(int answer) {
		System.out.println("老师,我得出了答案,18+32="+answer);
	}
}
//定义一个学生的接口,因为学生也有很多,所以也要把他们抽象出来在这里学生主要任务是解决问题
//解决完问题就得呼叫老师,所以这里也必须拿到老师的句柄
interface Student{
	public void resolveQuestion(Teacher teacher,int x,int y);
}
//接下来让学生Bob时响Student接口
class Bob implements Student{
	public void resolveQuestion(Teacher teacher,int x,int y) {
		int answer=0;
		//想了半天
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//得出答案
		answer=x+y;
		//得到答案了,调用老师的方法告诉他,这里的tellAnswer()方法也就是我们常说的回调方法
		teacher.tellAnswer(answer);
	}
}
public class TestDemo{
	public static void main(String args[]) {
		Student bob=new Bob();
		MathTeacher mathTeacher=new MathTeacher(bob);
		mathTeacher.askQuestion();
	}
}

输出:

Bob,你计算一下18+32等于几
老师,我得出了答案,18+32=50

完美输出!注释中解释的已经很详细了,在这里我就不再进行解释了,如果还是不太明白,那就把程序多看几遍,当初我也是不明白,不明白为什么学生要拿到老师的句柄,老师要拿到学生的句柄,多思考一下自然就明白了。

Demo 2:警察抓小偷问题。

明天接着吧,太累了~~~~~~~~