所谓回调,就是客户程序C调用服务程序S中的某个方法a,然后S又在某个时候反过来调用C中的某个方法b,对于C来说,这个b便叫做回调函数。
一般说来,C不会自己调用b,C提供b的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的b叫甚名谁,所以S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数,这个过程称为回调函数的注册,r称为注册函数。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。
这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
如果你还不太清楚看看这段描述合和代码:
声明一个接口,另外一个类有方法里面有个参数以是这个接口类型的,而后在另外类中实现这个接口(java中多用的是匿名内部类),而且以这个匿名的类生成的对象为参数传到上面提到类中,而后实现回调.......这种用法可以参考java里面常用到的数据库操作所用到的几个接口.....
//声明一个接口
public interface ICallBack {
void postExec();
}
//另外一个类有方法里面有个参数以是这个接口类型的
public class Server {
private ICallBack callBack;
public void setCallBack(ICallBack callBack) {
this.callBack = callBack;
}
public void doSth() {
//可以做一些其他的工作,完成后调用回调方法,有点类似通知的意思
callBack.postExec();
}
}
//回调的实现
public class Client{
public static void main(String[] args) {
Server ser= new Server();
ser.setCallBack(new ICallBack() {
public void postExec() {
System.out.println("method executed.");
}
});
ser.doSth();//调用函数
}
}
另一个回调例子:
public interface ICallback {
public void func();
}
public class ClassWithCallbackFunction implements ICallback{
public ClassWithCallbackFunction() {
}
public void func(){
System.out.println("cccccccccccccccccc");
}
}
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
}
public void setCallback(ICallback callback) {
this.callback = callback;
}
}
public class MainClass {
public MainClass() {
}
public static void main(String[] args) {
Caller caller = new Caller();
caller.setCallback(new ClassWithCallbackFunction());
caller.doCallback();
}
}
现实中是把doCallback()方法放在setCallback里调用,以上是为了说明回调原理
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
}
public void setCallback(ICallback callback) {
this.callback = callback;
doCallback();
}
}
分享到:
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
1. 肯尼迪总统的讲话假设:这是一道逻辑推理题,与Java编程技术无关,但可以考察逻辑思维能力。肯尼迪的讲话假设美国石油公司只关心利润,不顾政府的指示。 2. 专利意识与企业行为:此题考察的是对企业专利工作的...
该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...
- 调参技巧,如网格搜索、随机搜索等,找到最优超参数组合。 7. **扩展与进阶** - 多分类Logistic回归:如softmax回归,适用于多于两个类别的问题。 - 集成学习:如随机森林、梯度提升机等,结合多个Logistic...
《聊天工具的Java开发:超越QQ,天翔ZZ》 在IT行业中,开发一款聊天工具是一项挑战性十足的任务,尤其当目标是超越如QQ这样的巨头时。本文将深入探讨使用Java语言开发聊天工具的关键知识点,结合"天翔ZZ"这个项目,...
Java线程池是一种高效管理线程资源的工具,它的设计思想是基于生产者消费者模型,借鉴了工厂模式和代理模式的元素。线程池通过维护一组可重用线程,减少了创建和销毁线程的开销,提高了系统响应速度与并发处理能力。...
本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...
在这个名为"fizzbuzz:Java FizzBuzz"的项目中,存储库包含了多种不同的Java实现方式,供面试者参考或用于教学目的。 首先,我们来看FizzBuzz问题的基本逻辑。可以使用一个for循环遍历1到指定数字,然后通过if和...
当队列中有新消息时,RabbitMQ会回调预先设置的回调函数,处理消息。 7. **消费消息**:在回调函数中,可以获取消息内容,并进行相应的业务处理。处理完成后,需要确认消息已被消费,通常使用`channel.basicAck`...
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
ZZ Fibo Trader 是一款专为 MetaTrader 5(MT5)平台设计的自动交易专家顾问(EA),其核心在于结合了斐波那契回调线分析和抛物线止损系统,为交易者提供了智能化的交易策略。本文将深入探讨这款EA的设计理念、功能...
### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...
"zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战。Lukas Eder 愉快地接受了这个挑战,他将告诉我们如何使用 Java 8 来生成ABC的序列——当然,肯定不是一种蹩脚的方式。 我被 Stack Overflow 上网友...
《中医大夫助理信息系统 zz-doctor 深度解析》 中医大夫助理信息系统“zz-doctor”是一款基于Android平台的应用程序,旨在为中医医生提供智能化、便捷化的诊疗辅助工具。通过深入剖析这款应用的源码,我们可以了解...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...
根据提供的文件信息,我们可以推断出这是一份关于使用Java编程语言开发的“火影忍者”游戏的源代码。接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用...