深入理解java回调机制
Callback的定义
一般在程序中执行回调函数是,是知道回调函数是预留给系统调用的,而且知道该函数的调用时机。
比如说android应用定义一个button对象,并给按钮添加一个监听事件,"onClick"方法就是常用的回调函数,用户触发该事件,android系统会自动调用该函数。
目前最常见的说明就是:
1.class A,class B
2.class A实现接口callback
3.class B拥有一个参数为callback接口类型的函数
4.class A运行时调用class B中的函数,以自身传入参数
5.class B已取得A,就可以随时回调A所实现的callback接口中的方法
写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。
BadBoy:
- class BadBoy {
- String name;
- public BadBoy(String name) {
- this.setName(name);
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- //打人
- public void hit(Hitable hitable) {
- System.out.println("----------------BEGIN----------------");
- System.out.println("badboy " + this.getName() + "打了"
- + hitable.getName() + "一拳");
- hitable.beHit(this);
- System.out.println("-----------------END----------------");
- }
- }
挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来。
- interface Hitable {
- public void beHit(BadBoy boy);
- public String getName();
- public void setName(String name);
- }
Child:这个类实现了Hitable,小孩挨打了,反应是哭。。
- class Child implements Hitable {
- String name;
- public Child(String name) {
- this.setName(name);
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public void beHit(BadBoy boy) {
- System.out.println("child " + this.getName() + "被" + boy.getName()
- + "打哭了");
- }
- }
BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。
- class BigMan implements Hitable {
- String name;
- public BigMan(String name) {
- this.setName(name);
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public void beHit(BadBoy boy) {
- System.out.println("bigman " + this.getName() + "把" + boy.getName()
- + "杀死了");
- }
- }
test类:
- public class CallBackTest {
- public static void main(String[] args) {
- BadBoy badboy = new BadBoy("Tom");
- Hitable child = new Child("Cat");
- Hitable bigman = new BigMan("Boris");
- badboy.hit(child);
- badboy.hit(bigman);
- }
- }
执行结果:
- ----------------BEGIN----------------
- badboy Tom打了Cat一拳
- child Cat被Tom打哭了
- -----------------END----------------
- ----------------BEGIN----------------
- badboy Tom打了Boris一拳
- bigman Boris把Tom杀死了
- -----------------END----------------
这个例子可以看出,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。
这个例子类似一个通知,在做取值传值的时候会很有用。
例子2:
根据上边例子再联想一个例子,A取数据要给B,A是一个不断在polling数据的对象,B是一个接口,A取到数据后调用B接口的b方法,并且把自己的引用传给B,告诉B,我已经取到了你要的数据,你自己来拿吧,到这里,A已经完成了任务。B的实现类会根据自己的不同实现,在从A取来数据后进行处理,可能是排序,可能是输出到文件,也可能是打印。
例子2,证明了callback的另一个说法的概念:if you call me,I will call you back。
深入理解java回调机制的更多相关文章
- 转:一个经典例子让你彻彻底底理解java回调机制
一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...
- 一个经典例子让你彻彻底底理解java回调机制
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 所谓回调: ...
- 回调--一个经典例子让你彻彻底底理解java回调机制
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以前不理解什么叫回调 ...
- 理解java回调机制
摘自:ImportNew 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类 ...
- 一个例子教你理解java回调机制
网上很多例子都写的很难理解,笔者刚开始都已经弄晕菜了. 这个例子,应该是再简单,再简洁不过的了,例子目的是测试某个方法的执行时间.这里就写三个java类,一个接口,一个实现,还有一个用于测试时间的类. ...
- Java回调机制总结
调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...
- java回调机制及其实现(转)
1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...
- java回调机制(写的很好)
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 以前不理解什么叫回调,天天听人家说加一个回调方法啥的 ...
- 从零开始理解JAVA事件处理机制(2)
第一节中的示例过于简单<从零开始理解JAVA事件处理机制(1)>,简单到让大家觉得这样的代码简直毫无用处.但是没办法,我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码. 一:事 ...
随机推荐
- 搜狗主页页面CSS学习小记
1.边框的处理 要形成上图所示的布局效果,即,点选后,导航下面的边框不显示而其他的边框形成平滑的形状.相对于把导航的下面边框取消然后用空白覆盖掉下面搜索栏的边框比较而言,sougou有很好的方法来 ...
- Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照 在Xenserver上可以创建Windows和Linux等虚拟机,Xenserver支持大部分的主流操作系统,可以使用 XenCe ...
- Java静态代理和动态代理
今天介绍一下代理设计模式,在业务场景中使用代理模式的好处有很多,包括什么权限校验,事务管理等等,具体有什么好处大家自动百度吧,我这里只解释代理模式的设计原理.首先这个设计模式出来的时候先是静态代理模式 ...
- 使用Pechkin将HTML网页转换为PDF
Pechkin开源组件使用wkhtmlbox,可以解析CSS样式,将网页转换为PDF文件, 支持URL,或者HTML字符串 1, 从NuGet程序管理器中获得Pechkin GlobalConfig ...
- 应聘linux/ARM嵌入式开发岗位
**************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...
- centos设置服务开机自启动
在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后系统默认不会自动启动的.就算手动执行/etc/init.d/mysqld start ...
- .NET基础——数组
这一篇,我们来看C#中的数组. 1. 数组的概念 数组:存储相同类型多个数据元素的容器 数组的声明和初始化: 在创建数组的时候,必须指定数组的长度 ]; ,, }; ] { , , };//数组元素的 ...
- 【.NET】电话号码打星号(隐藏部分)
描述:支持多个电话: //隐藏部分内容,支持一个值有多个联系方式,用逗号隔开.//参数:value - 值,subIndex - 从第几位开始,subQty - 隐藏几位数 protected str ...
- 百度的hao123.com篡改浏览器首页,解决办法
快捷方式右键找到chrome.exe, 把chorme.exe修改成别的名字例如 chromeFuckHao123.exe 就OK了. hao123是用病毒的形式查找chrome.exe然后进程注入的 ...
- 舒适的路线 (code[vs] 1001)
传送门 :code[vs] 1001 思路:拿到这题的首先的思路 , 就是跑一遍最短路. 可是在尝试了一会后发现不会写,于是果断弃 尝试另外的算法.. 于是就有的以下的算法.并查集 + 乱搞(有点像 ...