说说什么是回调
来源:互联网 发布:mac 软键盘 编辑:程序博客网 时间:2024/06/11 15:51
同事问我,到底Java里面什么是回调,该如何使用回调,看来还是有很多人没理解回调的概念。
首先,回调函数是什么,维基百科的解释是,通过函数参数传递到其它代码的,某一块可执行代码的引用。
In computer programming, a callback is a reference to executable code,
or a piece of executable code, that is passed as an argument to other
code.
我们用一个典型的回调例子来说明
package callback;/** * @author lhq */public interface CallBack { public void onCallBack();}
首先是用于回调的接口,我们在接口里面定义了一个方法,叫onCallBack();
/** * @author lhq */public class A { private CallBack aCallBack; public void setCallBack(CallBack callBack) { this.aCallBack = callBack; } public void excute(){ aCallBack.onCallBack(); }}
其次是类A,里面有一个方法setCallBack(CallBack callBack),传入一个CallBack接口的实现对象,并且定义了一个私有的属性aCallBack来接收这个对象。还有一个方法excute(),在这个方法里调用了aCallBack的onCallBack()方法
/** * @author lhq */public class B { public static void main(String[] args) { CallBack bCallBack = new CallBack() { @Override public void onCallBack() { System.out.println("我是回调函数"); } }; A a = new A(); a.setCallBack(bCallBack); a.excute(); }}
最后是类B,在这个类的main函数里面,new出了A的一个实例a和接口CallBack的一个实现 bCallBack,并且让bCallBack的onCallBack()方法打印字符串“我是回调函数”。然后执行a的excute()方法。
此时,运行类B的主函数,会发现控制台上输出“我是回调函数”。
我们来分析一下这个例子
看类B,main函数执行的时候,首先执行了代码
CallBack bCallBack = new CallBack() { @Override public void onCallBack() { System.out.println("我是回调函数"); } };
这段代码的意思是,在内存里创建了一个CallBack的对象,这个类的onCallBack()方法会在控制台输出字符串“我是回调函数”,然后,将这个对象的引用赋给了参数bCallBack. 如图:
随后,执行了代码
A a = new A();a.setCallBack(bCallBack);
setCallBack(bCallBack)方法中执行了操作
public void setCallBack(CallBack callBack) { this.aCallBack = callBack; }
我们要理解一点,方法的参数传递的是对象的引用,也就是说,当我们执行setCallBack方法时,我们将bCallBack持有的对象的引用传递给了a对象的aCallBack属性。如图:
也就是说,此时,A类的实例a中的aCallBack属性,其实持有的是之前new出来的bCallBack所指向的对象,于是当我们执行a.excute()方法
public void excute(){ aCallBack.onCallBack(); }
时,执行的就是B类里面new出来的CallBack对象的方法。
回到之前对于回调的定义:通过函数参数传递到其它代码的,某一块可执行代码的引用。
现在看起来是不是直观多了,通过a.setCallBack(CallBack callBack)方法,将B类中创建的对象的引用传递到a中,然后a就能通过这个引用执行该引用对应的对象所实现的方法或者说代码。
以上就是我对回调的理解,如果有错漏的地方,欢迎指出,感激不尽
- 说说什么是回调
- 详细说说什么是绿色软件
- 说说什么是癫痫病
- 简单说说什么是Restful
- 跟90后说说什么是江湖规矩
- 开山之作,简单说说什么是"集群(Cluster)"
- 开山之作,简单说说什么是"集群(Cluster)"
- 开山之作,简单说说什么是"集群(Cluster)"
- 说说什么是重构(一)重构的起点
- 说说什么是重构(二)重构的过程
- 说说什么是重构(三)重构的结果
- 说说双调排序
- 什么是回调(摘抄)
- 什么是接口回调?
- 什么是回调
- 什么是接口回调?
- 什么是回调
- 说说
- 爬虫学习记录(二)
- 如果不想弄了,厌烦了
- UVa 10815 Andy's First Dictionary 【STL】【set】
- 性能优化之快速响应的用户界面
- [指数型生成函数] HDU 1521 排列组合
- 说说什么是回调
- linux下运用c实现队列调度
- 西蒙斯告诉你何为传奇人生 James Simons
- PAT A1071. Speech Patterns (25)
- Glide使用详解
- RecyclerView加下划线的工具类和用法
- Maven 配置SpringMVC常见一问题
- 拦截器和过滤器
- AttributeError: 'module' object has no attribute '_base'