现在的位置: 首页 > 综合 > 正文

Java回调函数的理解

2018年06月05日 ⁄ 综合 ⁄ 共 1279字 ⁄ 字号 评论关闭

 所谓回调,就是客户程序Client调用服务程序Server中的某个函数funA(),然后Server又在某个时候反过来调用Client中的某个函数funB(),对于Client来说这个funB()就叫做回调函数,一般情况下,Client不会自己调用funB(),Client提供funB()的目的就是为了让Server来调用它,而且Client不得不提供这样一个函数。但是,由于Server并不知道Client所提供的funB()的具体情况,所以Server会约定funB()的接口规范(函数原型),然后由Client提前通过Server的一个函数register()来通知Server自己将要使用funB()函数,这个过程称为回调函数的注册,register()称为注册函数。

下面讲一个通俗的例子:
某天,我打电话向你请教一个问题,你一时想不出解决方案,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后在打电话通知我,这样,我就先挂了电话办其他事情去了。过了10分钟,我的手机响了,你电话告诉我问题的解决方案!

总结:这个案例中,你打电话告诉我解决方案就是一个"回调"的过程;我的手机号码必须在以前告诉你,这就是注册回调函数;我的手机号码必须有效并且能够接听到你的呼叫,这就叫回调函数必须符合接口规范。

实例:小明写了一段程序A,其中预留了回调函数接口,并封装好了该程序。小华写了一段程序B,小华想让程序A来调用自己程序B中的一个方法,于是,他通过程序A中的接口回调自己程序B中的方法。在c/c++中,要用回调函数,被调用的函数需要告诉调用者自己的指针地址,但在java中没有指针,怎么办呢?我们可以通过接口(Interface)来实现定义回调函数。

小明写的程序A:

public class CallAproTest {

	private ICallBack mcall;
	
	/*通过构造函数来设置接口的引用*/
	public CallAproTest(ICallBack mcall) {
		this.mcall = mcall;
	}

	/*在这个方法中调用回调方法*/
	public void call(){
		
		this.mcall.test();
	}
}

定义一个接口,以便小华根据接口编写程序实现:

/**
 * 回调接口
 *
 */
public interface ICallBack {

	public void test();
}

小华只要实现这个接口就能达到回调的目的了:

/**
 * 通过实现接口来达到实现回调的目的
 */
public class CallProTest2 implements ICallBack {

	/*实现接口中的额方法*/
	public void test() {
		System.out.println("回调!");
	}

	public static void main(String[] args) {
		
		/*创建小明程序的一个对象*/
		CallAproTest callAproTest = new CallAproTest(new CallProTest2());
		
		/*调用CallAproTest中的方法*/
		callAproTest.call();
	}
}

抱歉!评论已关闭.