Java回调函数
谈到回调函数,最通用的例子还是“打电话问问题”,我打电话 向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电 话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模 式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你 的呼叫,这是回调函数必须符合接口规范。
这个故事理解起来很容易,可真要你写时就可能会模糊。当然也可能是我看到的例子有点复杂,涉及到了线程和异步处理,代码复杂化了,反而把我给转晕了,具体代码不便公开,刚才花了近两个小时,从宏观角度看代码,把功能集中化,折叠起来,最后终于看明白了,也对回调函数有了进一步的理解。下面我把网上的一个经典解释回调函数的例子转载过来,与诸君分享一下。
/** * 包含有回调方法的类 * 呼叫我 */ public class CallMe { public void call(CallBack callBack){ // 参数是CallBack接口类型 System.out.print("我把我的手机号码给你,你通过电话号码"); callBack.execute(); // 回调,不同部分(****),即打电话 OR 发短信 System.out.print("联系我!"); } } /** * 回调接口 */ interface CallBack { void execute(); } //上面的通常在一起,下面开始调用,即使用“回调”的类 /** * 使用回调的类 * “打电话” */ public class CallUp { public static void main(String[] args) { CallMe callMe = new CallMe(); callMe.call(new CallBack(){ public void execute(){ System.out.print(" 打电话 "); } }); } } /** OutPut : ~ * 我把我的手机号码给你,你通过电话号码 打电话 联系我! */ /** * 使用回调的类 * “发短信” */ public class SendMessage { public static void main(String[] args) { CallMe callMe = new CallMe(); // 创建一个实现CallBack的匿名内部类 // 通过new表达式返回的引用自动向上转型为对CallBack的引用。 CallBack callBack = new CallBack(){ public void execute(){ System.out.print(" 发短信 "); } }; callMe.call(callBack); } } /** OutPut : ~ * 我把我的手机号码给你,你通过电话号码 发短信 联系我! */
浙公网安备 33010602011771号