回调函数原本是C++中的概念,允许底层程序调用高层定义的某个函数块。
Java引入了回调函数,实践证明回调手段具有广泛的用途。
所谓回调,即客户端Client条用了服务端Server中的方法execS,然后Server在接下来的某个时候调用了Client的方法execC,这个过程就叫做回调。对于Client来说,方法execC就是回调函数。
例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,Client不会自己调用execC,Client提供execC的目的就是让Server来调用它,而且是Client不得不提供。由于Server并不知道Client提供的execC姓甚名谁,所以Server会约定execC的接口规范(函数原型),然后由Client提前通过Server的一个函数Register告诉Server自己将要使用execC函数,这个过程称为回调函数的注册,Register称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
<span style="font-family:SimSun;">/**
* 客户端函数接口规范
*/
public interface CallBackInterface {
public void execC();
}
/**
* 客户端实现了回调接口(按照回调接口规范,定义回调方法)
*/
public class Client implements CallBackInterface{
public Client() {
}
@Override
public void execC() {
System.out.println("回调");
}
}
/**
* 服务器端
*/
public class Server {
CallBackInterface callBackInterface;
public Server() {
}
/**
* 注册函数,告诉服务器端要调用客户端的那个方法。
* @param callBackInterface 客户端函数接口规范
*/
public void register(CallBackInterface callBackInterface) {
this.callBackInterface = callBackInterface;
}
/**
* 提供给客户端调用的方法。
*/
public void execS(){
callBackInterface.execC();
}
}
//客户端测试类,因为是在客户端(client)调用的服务器端(server)
public class ClientTest {
public static void main(String[] args){
Client client = new Client();//创建一个要回调的客户端对象
Server server = new Server();//创建一个服务器端对象
server.register(client);//服务器端的注册函数
server.execS();
}
}</span><span style="font-family: 楷体_GB2312;">
</span>
上面是我对回调的一些理解,希望对大家有所帮助,欢迎拍砖。嘿嘿