Java回调函数理解和应用
来源:互联网 发布:js鼠标移开div消失 编辑:程序博客网 时间:2024/06/07 20:27
Java回调函数理解和应用
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的。
在未理解之前,我也是一脸懵逼,等我理解之后,发现和Javascript的回调函数原理基本是一样,一个是将对象作为参数传递,一个是将函数作为参数传递。
从维基百科上面摘抄定义:
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
举个例子有个程序员和一个项目经理,XX项目经理向程序员安排任务让程序员去完成,程序员获得任务并记下是XX项目经理安排的任务,程序员将任务完成后,获取通知XX项目经理的方式,发送一条信息通知项目经理任务已经完成。
下面上实例:
新建一个项目经理类:
public class ProjectManager { private String name; public ProjectManager(String name) { this.name =name; } public String getName() { return this.name; } /** * 通知方法 * @param msg */ public void noticeMe(String msg) { System.err.println(msg); } /** * 安排任务 * @param task */ public void arrange(String task) { //安排程序员干活 new Programmer().receiveTask(task, this); } public void doOtherWork() { System.err.println("项目经理干其他事情..."); }}
新建一个程序员类:
import java.util.concurrent.TimeUnit;public class Programmer { //记下是XX项目经理,而不是其他项目经理 ProjectManager manager; /**程序员接受任务*/ public void receiveTask(String task,ProjectManager manager) { this.manager = manager; try { //程序员开始执行任务 this.excuteTask(task); } catch (InterruptedException e) { e.printStackTrace(); } } /**执行任务*/ private void excuteTask(String task) throws InterruptedException { System.err.println("执行项目经理:"+manager.getName()+"安排的任务-->"+task); //任务执行中 TimeUnit.SECONDS.sleep(1); //任务完成 this.finished(task); } /**任务完成*/ public void finished(String task) { //获取通知项目经理的方法,并发出通知 //进行函数回调,这里还不算真正的回调 manager.noticeMe(manager.getName()+"你好,你安排的任务"+task+"已经完成!"); }}
新建测试类:
public class CallbackTest { /** * @param args */ public static void main(String[] args) { ProjectManager prjMgr = new ProjectManager("王响"); prjMgr.arrange("今晚完成数据库设计..."); prjMgr.doOtherWork(); }}
运行结果:
但实际上,项目经理可能有好多个联系方式,有些方式可能是无效的。那我怎样才能知道哪个才是真确的通知方式呢?那就需要项目经理指定哪个方式是正确的,这样程序员也只要记住联系方式即可。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
定义一个通知接口:
public interface Notice { public void noticeMe(String msg);}
改写项目经理类:
public class ProjectManager implements Notice{private String name;public ProjectManager(String name){ this.name =name;}public String getName(){return this.name;}/** * 通知方法 * @param msg */@Overridepublic void noticeMe(String msg){System.err.println(msg);}/** * 安排任务 * @param task */public void arrange(String task){//安排程序员干活new Programmer().receiveTask(task, this);}public void doOtherWork(){System.err.println("项目经理干其他事情...");}}
改写程序员类
import java.util.concurrent.TimeUnit;public class Programmer{ //指定了通知方式 Notice notice; /**程序员接受任务*/ public void receiveTask(String task,Notice notice) { this.notice = notice; try { //程序员开始执行任务 this.excuteTask(task); } catch (InterruptedException e) { e.printStackTrace(); } } /**执行任务*/ private void excuteTask(String task) throws InterruptedException { System.err.println("执行项目经理:安排的任务-->"+task); //任务执行中 TimeUnit.SECONDS.sleep(1); //任务完成 this.finished(task); } /**任务完成*/ public void finished(String task) { //获取通知项目经理的方法,并发出通知 //进行回调通知 notice.noticeMe("你好,你安排的任务"+task+"已经完成!"); }}
那我们为什么要使用回调函数呢?
简单来说就是,我自己活太多,或者有其他的事需要做,自己不想做,就把这个活分配给别人去完成,并把完成的结果告诉我就行了。
如果看到这里你若还没有懂的话,那我换一种方式表达:回调函数就是别人要调用我的时候,我要告诉别人我这个方法的地址在那里,然后别人直接找这个地址就行,不用再去向系统申请内存地址然后去找这个方法在哪里。
- Java回调函数理解和应用
- Java - 回调函数的理解和应用
- java理解“回调函数”
- 理解Java回调函数
- 理解Java回调函数
- Java回调函数理解
- 回调函数理解Java
- JavaScript回调函数应用理解浅析
- JavaScript回调函数应用理解浅析
- java的回调函数理解
- Java回调函数的理解
- Java回调函数的理解
- Java回调函数的理解
- Java的回调函数的理解
- Java回调函数的理解
- JAVA回调函数深入理解
- Java回调函数的理解
- java回调函数的理解
- 制作TFrecords格式数据
- Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID。
- 清除、删除、重置AD账户、OU属性值&往AD的OU属性添加值
- 比较函数
- 如何用5天设计出一款认真的产品?
- Java回调函数理解和应用
- php不用composer引入tcpdf,生成pdf
- 求出一维数组中的最大值和最小值
- 基于nginx的负载均衡与反向代理
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- css线性渐变及兼容
- encode和decode
- web-service学习-----REST
- FPGA作业3:通过时钟产生双向移位寄存器