理解Java回调机制

UE5 蓝图节点图文大全(300+蓝图,9万字+) 本文采用虚幻5.2.1版本,以图文的方式对蓝图节点进行介绍,包括蓝图节点的输入输出参数解释,并有中英文节点名称可参考。 阅读详情

其实对于回调机制,在实际使用中还是经常用到的。但好笑的是,一直没能对所谓的回调的概念有一个很清晰的理解。

最近抽空看一些书的时候,老是时不时的提到回调的概念。那好吧,正好抽空来简单总结总结,加深一下印象和理解~


网上的百科之类的资料中,看到的对于回调比较书面和规范的解释是:

在计算机程序设计中,回调函数是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。


不知道别人对于这样比较“官方的”概念是一种怎么样的感受,反正我是“一头包”,个人十分讨厌这种书面解释。

于是又在网上看了一些别人写的关于回调的文章,发现很久以前就有别人作了一个很形象的比喻:

某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等。

于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。

过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。


这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;

我的手机号码必须在之前就告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。


而该作者针对这一情况给出的例子如下,假设我是程序员A,以下是我的程序a:

public class Caller  
{  
    public MyCallInterface mc;  
  
    public void setCallfuc(MyCallInterface mc)  
    {  
       this.mc= mc;  
    }  
  
    public void call(){  
       this.mc.method();  
    }  
}  

我还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。
    public interface MyCallInterface  
    {  
        public void method();  
      
    }  


于是,程序员B只需要实现这个接口就能达到回调的目的了:

    public class B implements MyCallInterface  
    {  
        public void method()  
        {  
           System.out.println("回调");  
        }  
      
        public static void main(String args[])  
        {  
           Caller call = new Caller();  
           call.setCallfuc(new B());  
           call.call();  
        }  
    }  

看完这个例子过后,对于回调似乎有一定的理解了,但似乎却还是处于一种似懂非懂的状态,蛋疼中...

于是又继续查找了一些资料,然后发现,上面的例子对于“回调”思想体现的重点大致在于:

在Java当中,一般来说类的成员变量一般都是数据对象,主要是用来传递数据用的。

而回调的意思是:把一段程序作为成员变量,在特定的场合使用该段程序。这就是回调的核心。

这就刚好对应了上面讲到的,网上的百科资料中对于回调比较“书面”和“官方”的解释了。


所以,大致来讲对于上面的例子中:

程序员A就是想要把一段程序,也就是函数“method”作为成员变量来使用;但是呢,Java的语言特性导致了一段程序是不能单独作为变量和参数来使用的。

那么,基于面向对象的特性,就只能将其封装成类也就是对象来使用。但是这段代码在程序员A进行编程的时候又是无法确定的,它只能提供一个入口(即声明),让B去实现。

这种特点恰恰适合于Java当中Interface的特点。于是,函数“method”被封装在了接口“MyCallInterface”当中。


到了现在,可算明白了,“method”方法就是这里的所谓的“回调函数”。

而这个例子中,整个的回调过程,就可以简单的分解为:

程序员A遇到难题,无法解决,于是请教程序员B = ProgrammerA call toProgrammerB

程序员B收到问题,进行思考,最终给出解决方案 = ProgrammerB call toProgrammerA

当程序员给出解决方案,通知给程序员A时,这个过程就是所谓的回调了。


当我对这个例子进行了一番琢磨后,感觉就是:

对于打电话请教问题的这个经典用例自身,是很能够描述回调的思想的。但是,对于这个例子来说,

对于回调的说明似乎并不能得到给人一种醍醐灌顶的体验。


至少我是这样觉得的,所谓回调回调的,通常第一感觉就是:

既然要回,那么就如同打电话请教问题的例子一样,

我打电话给你了,你得回电给我,这才算是完成了一个回调嘛。

但在上面他的例子中,这个“回电”的过程没有一个很明显的体现。


另一种场景似乎更能更加明显直接的对于回调进行说明。

在其它的博客里看了对于回调的经典应用场景有这样一种说法:

  • Class A实现接口CallBack callback——背景1
  • class A中包含一个class B的引用b ——背景2
  • class B有一个参数为callback的方法f(CallBack callback) ——背景3
  • A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
  • 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D

对于这种应用场景,我们来结合一些“身边的实际现象”,就能很好的帮助自身进行理解。

最近恰逢年初,又是一年跳槽的高峰期了。

所以对于员工离职与跳槽的现象,其实也可以帮助我们对“回调”进行理解。


跳槽的很常见的原因自然就是薪资问题,那么:

假设我们作为一个员工,又是新的一年了,工资依旧可怜巴巴,心里捉急啊。

这时怎么办呢?跳吧?那万一刚跳,薪资又要调整了呢?

于是,决定了,先和BOSS“谈判”,根据结果再做最后的决定。

这个时候,实际上也就是所谓的一种回调。

我们以一个程序猿的角度来分解这个问题:


首先,员工想要从老板处得知关于薪资调整的结果,那么就需要一个“途径”,于是出现了一个回调接口:

/**
 * 回调接口
 * @author hql 
 * 2015/03/03
 */
public interface Negotiation {

	/*
	 * 实际这就是你向BOSS提供的回复你调薪询问的一种途径
	 *  BOSS根据该途径给你一个结果,而你就可以通过该结果来做出决定
	 */
	public void setNewSalary(int salary);

}

接下来,就是员工类的定义:
/**
 * 员工类
 * @author hql 
 * 2015/03/03
 */
public class Employee implements Negotiation {//背景1
	private Boss boss = new Boss(); //背景2
	private int newSalary;

	/*
	 * 开启谈判
	 */
	void startNegotiation() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				//背景:Class A调用Class B中的某个方法C
				boss.doNegotiation(Employee.this);
			}
		}).start();
	}

	/*
	 * 回调函数,从BOSS处获取薪资调整结果
	 */
	@Override
	public void setNewSalary(int salary) {
		this.newSalary = salary;
		makeDecision();

	}

	/*
	 * 根据薪资调整结果做出最终决定
	 */
	void makeDecision() {
		if (newSalary >= 10000) {
			System.out.println("调薪满意,继续奋斗!");
		} else {
			System.out.println("呵呵,拜拜了您!");
		}
	}
}

紧接着,是老板类:
/**
 * 老板类
 * @author hql 
 * 2015/03/03
 */
public class Boss {

	public void doNegotiation(Negotiation negotiation) {//背景3
		System.out.println("小子去年干的不错,涨!");
		// Boss call back to Employee - 回调
		negotiation.setNewSalary(10000);
	}

}

一切准备工作就绪,接下来就是真正的“谈判了”:
/**
 * 回调函数测试类
 * @author hql 
 * 2015/03/03
 */
public class TestCallBackFunc {
	public static void main(String[] args) {
		Employee xiaoli = new Employee();
		xiaoli.startNegotiation();
	}
}

到了这里,终于对所谓的“回调机制”有了一个较为清晰的理解了。
正如上面的例子当中,所谓回调的过程就是指:

首先,是员工类(Class A)当中调用了老板类(Class B)的方法:“doNegotiation”,由此向老板提出调薪的要求。(employee call to boss)

然后,老板收到请求,做出决定。于是老板类(Class B)回过头又调用了员工类(Class A)当中的方法:“setNewSalary”。(boss call to employee)


所以,其实针对回调,如果我们作更通俗的理解,其实就是:

一个员工想要调薪,针对于调薪,就自然会有一个结果,但是这个结果步是员工自身能决定的,需要由BOSS来拍板。

那么,自然的,针对于该调薪结果,就需要一个“介质”,也可以说是一个“渠道”来在员工与BOSS之间进行沟通。

而“回调函数”在整个回调过程中,起到的作用就是这个“介质”。


我们不妨把上面的例子当中的回调函数“setNewSalary”视作一张“员工薪资调整申请表”,那么整个回调过程就变成了:

某员工想要申请薪资调整,于是找到老板(调用BOSS类当中的方法),告诉BOSS,我想要调薪了。

老板收到了请求,做出了决定。现在要将这个结果返回该员工,这个返回的过程就被叫做回调。

但这个返回结果的方式肯定应该符合一定的规范,因为至少要让该员工意识到,BOSS已经针对于你的要求给出结果了。

“员工薪资调整申请表”就是该公司针对于“调薪结果”的提出的规范,员工根据该申请表就能得知自己的调薪结果。

所以说,之所以我们在程序中定义回调接口,其实就是在声明一种规范,确保程序的严谨性。


试想一下,该老板给出结果过后,正好碰到某个保洁人员,于是对这个清洁人员,正好,你去告诉某某员工他的调薪结果是xxxxx,那合理吗?


柑橘病虫害识别方案总结 1. 方案一 1.1 赛题背景 1.2 数据分析 1.3 模型设计 1.3.1 模型具体方案 1.3.2 模型设计 1.4 实验结果 1.5 总结与展望 2. 方案二 2.1 赛题介绍 2.2 数据分析 2.3 算法方案解析 2.3.1 检测模型 2.3.2 提升策略 2.4 优化思路 3. 方案三 3.1 数据分析 3.1.1 数据说明 3.2 技术展示 3.2.1 数据输入端 3.2.2 模型结构端 3.2.3 上下文信息 3.2.4 训练优化端 3.2.5 创新性分析 3.3 算法及系统思考..... 阅读详情

相关推荐

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策

统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25

weixin_30846347的博客 264

java+代码回调+编写_Java回调实现

Java回调实现什么是回调回调核心思想案例代码实现后序一、什么是回调开发过程当中存在某种特殊的业务需求,例如:回调生活实例.PNG描述:老板给员工下达了工作任务之后,就去做其他事情了。(此时此 刻,老板不知道需要多长时间完成,不会一直等着,而是做自己其他事情)员工接收到任务之后,按照要求完成任务当员工任务完成的时候,主动的回馈给老板工作情况。当员工回馈工作情况的时候,此时此刻老板还在做另外的事情二...

weixin_39730801的博客 584

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 333

Java 实现回调

回调函数。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 2067

AD元件库构建及维护之——DbLib公共元件库的使用教程

AD元件库构建及维护之——DbLib元件库的使用教程

qq_43105486的博客 2万+

[LVGL] 刷新率优化

实验硬件:STM32F407ZGT6;2.4寸TFT-LCD模块(ILI9341驱动芯片、XTP2046触摸芯片)本文目标:lvgl的刷新率优化,解决拉帘子问题注意:本文在LVGL显示触摸代码移植完成的基础上进行,第一次使用lvgl可根据前文一步步移植,点击下方传送门查看相关文章传送门:STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(一)STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(二)[LVGL] 显示代码移植 基于STM32F4。

2301_77117901的博客 2784

JAVA回调机制(CallBack)详解

但是有些函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。

weiweiqiao的专栏 1932

Unity Android构建报错:compileSdk 35兼容性五层定位法

Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问

weixin_32496547的博客 567

【java】方法回调

方法回调(Method Callback)是指在编程中将一个方法作为参数传递给另一个方法,并在适当的时机调用这个方法的编程技术。方法回调是一种设计模式,允许某个方法在另一个方法执行过程中或执行之后被调用。它本质上是一种函数指针机制,常见于需要延迟执行或异步执行的场景。通常,回调函数由接口(或抽象类)定义,这个接口声明了回调方法。方法回调是一种强大的编程技术,通过解耦调用者和执行者,使代码更加灵活和模块化。它广泛应用于异步操作、事件驱动开发、多态设计等场景。掌握方法回调可以帮助开发者设计出更优雅和高效的程序。

2401_83045332的博客 2195

USB2.0协议解读

就写到这吧,其他协议层等属于软件需要了解的东西了。简单看了下,本文总结的有点乱,有两个原因吧,其一是理解的不够透彻,无法用简单明了的语言总结;其二是感觉这个协议文档章节划分的也不是很好,有点大杂烩。

qflook的博客 3673

使用GitLab限制开发者使用CI/CD的权限,三种方案

使用三种方案来限制开发人员的CI/CD权限。

知无涯 5095

什么是java回调函数

总的来说,回调函数是一种强大的编程模式,可以在 Java 中实现灵活的异步处理和解耦,但需要合理设计和使用,以确保代码的可维护性和性能。

郝老三~~~~~~~~~~~~~ 6127

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2185

理解回调机制-java

个人认为理解回调的第一个关键是了解它的**应用场景**,其实回调机制就是普通的使用接口进行普通调用的过程,没有任何特别的地方,但是为什么它如此难以理解呢,是因为你用到了它见到了它但是却没有注意到为什么使用它。第二个关键是了解它的**运作方式**

Walk_er's blog 1061

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

理解java的回调机制

Java回调机制一、方法的调用模式理解接口和抽象类的设计理念二、回调场景三、小结 最近学习了一下Java 的回调机制,查看了网络上的一些内容,并借鉴了一些在这里整理一下自己的思路。 一、方法的调用模式 (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。这种调用方式适用于方法b()执行时间不长的情况,因...

KevinLyz的博客 4294

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

两个经典例子让你彻底理解java回调机制

先让我们通过一个生活中的场景来还原一下回调的场景:你遇到了一个技术难题(比如,1+1等于几?太难了!),于是你去咨询大牛,大牛说现在正在忙,待会儿告诉你结果。 此时,你可能会去刷朋友圈了,等大牛忙完之后,告诉你答案是2。 那么,这个过程中询问问题(调用对方接口),然后问题解决之后再告诉你(对方处理完再调用你,通知结果),这一过程便是回调。 系统调用的分类 应用系统模块之间的调用,通常分为:同步调用,异步调用,回调。 同步调用是最基本的调用方式。类A的a()方法调用类B的b()方法,类A的方法需要等到B类的

程序新视界 1167

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack cal...

dianchange8716的博客 104

彻底理解java回调机制

彻底理解java回调机制

hl199612的博客 725

深入理解 Java 接口的回调机制

接口的回调机制是 Java 编程中的一项强大工具,它通过接口定义行为规范,调用方控制回调的时机,实现了灵活的程序设计。无论是在 GUI 编程、异步任务,还是复杂的设计模式中,回调都发挥着重要作用。在 Java 中,由于不支持直接将方法作为参数传递,回调通常通过接口实现。接口定义了一组方法规范,调用者实现接口,并将接口实例传递给调用方,调用方在适当的时机调用接口的方法。在观察者模式中,观察者实现接口,并在被观察者状态改变时接收通知。通过回调机制,调用方可以动态调用不同实现,增强了程序的灵活性。

2302_79376097的博客 9326

回调接口是什么意思_关于Java回调机制的一点个人理解

小生初出茅庐,未经世事,言论如有谬误,望请诸神斧正! 二话少说,直接正题!相信正在学习Java的,初级的,中级的不少同学们都为Java的回调机制深深地迷惑过!其实所谓的“回调”并不是Java特有的,C++用的更骚!想理解什么是回调,我首先要告诉你们理解回调到底有什么用。我总结了有几点:第一点,理解了回调,你就能理解别人写的软件架构,再深入一点,你甚至还可以自己去看开源框架源码……或许说法夸张,但...

weixin_39800062的博客 347

java回调机制的通俗理解

今天看安卓书,遇到了java回调,不太明白,但是经过在网上一番搜索,也总算是理解了一点,在此把心得记下来,一个是为了日后万一忘记了可以再看看,另一个是如果帮到了你,我会很开心。 回调包括同步和异步两种。 先说异步: 我想吃德克士,于是叫了德克士的手枪腿两个,叫之前我把自己的住址(按照德克士要求的格式)发送给了德克士餐厅的前台,我放下电话开始打王者荣耀等待手枪腿的到来。 与此同时,德克士厨师

ztgreenleaves的博客 621

深入理解Java中的回调机制(最通俗易懂的回调机制的博客)

最好的讲述Java回调机制的博客

在地图上飞行 2199

Java以及Android回调机制的一些理解

安卓的View如Button,ImageView都有事件监听,而事件监听就是一个回调函数。回调函数在实际的应用中也是十分的重要。网上也讲过很多回调函数的,我也只是写一写自己的感悟,以及对回调函数的理解。        首先谈谈什么是回调函数,引用一段话:在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个

qq_28251907的博客 603

夯实Java基础系列11:深入理解Java中的回调机制

本文主要介绍了Java中的回调机制,以及Java多线程中类似回调的机制。 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/04/26/javase9 更多关于Java后端学习的内容请到我的优快云博客上查看:https://blog.youkuaiyun.com/a7...

Java技术江湖 3971

java点击事件函数,通过Anroid onClick函数理解JAVA回调机制

本文通过介绍Android事件监听机制来了解下Java的回调机制,即当你点击一个button的时候发生了什么,点击之后是如何调到自己写的onClick函数的。写过Android小程序的同学肯定都写过如下的代码:button = (Button) findViewById(R.id.button1);button.setOnClickListener(new Button.OnClickListen...

weixin_29333353的博客 630
上一篇: Java网络编程 - 浅析web服务器与浏览器的实现原理
下一篇: 记,基于Android开发类似于微博的东东时,值得记录的几个问题~
LaterEqualsNever
博客等级 码龄12年 297粉丝 61原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值