onclick,onfocus,onload,oncreate...... 我们在java GUI 编程、js事件、android组建中常常见到这些单词,这些函数就是回调函数。C语言利用指针实现回调,与面向对象的语言不同。我们这里介绍利用java的接口实现回调的方法。
回调是一种双向的调用模式,例如我们要调用B的一个特定的方法,B在执行完又要调用A的一个方法,而这个A(或者说A的这个方法)是由我们自己实现的。所以可以这样理解:“回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。”
不过,有了面向对象的机制后,我们就可以轻松地使用这套机制来实现回调了,让回调变得简单。
例子:
package com.yawn.callback;
/**
* 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onFinish方法
* A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
*
* @author yawn
*
*/
public class CallBack {
public static void main(String[] args) {
B b = new B(new A()); // 初始化B并指定B所要回调的对象(方法)
b.go();
}
}
class A implements Finish{
@Override
public void onFinish() {
System.out.println("finish");
}
}
package com.yawn.callback;
/**
* B的内部实现也很简单,只需要一个接口类型的成员变量(这个成员变量的具体实现由我们初始化B时指定),
* 在执行方法完成时调用这个成员变量(接口对象)的onFinish方法即可
*
* @author yawn
*
*/
public class B {
Finish f ;
public B(Finish f){
this.f = f;
}
void go(){
System.out.println("Go go go!");
if (f != null){
f.onFinish();
}
}
}
package com.yawn.callback;
public interface Finish {
void onFinish();
}
这样就可以在调用B的go方法之后又调用我们实现的onFinish方法了。
运行结果
Go go go!
finish
其实在初始化B时不一定要实现一个类A,也可以直接实现接口中的方法:
package com.yawn.callback;
/**
* 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onClick方法
* A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
*
* @author yawn
*
*/
public class CallBack {
public static void main(String[] args) {
B b = new B(new Finish() {
@Override
public void onFinish() {
System.out.println("finish");
}
});
b.go();
}
}