java 回调

  1. 什么是回调
  2. 回调核心思想
  3. 案例代码实现
  4. 后序

一、什么是回调
回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。

eg:

public interface CallBack {
 // 定义一个报告 反馈的方法
 public void baoGao(int num);
}
Boss implements callback{
	Worker a=new worker();
	//派a去干活,并且把自己传进去
	a.gojob(this); 
	@Override
	public void baoGao(int num) {
	 System.out.println("员工反馈工作信息");
 }
}
 Worker extends Employee {
 @Override
 public void wanChengRenWu(CallBack callBack) {
 // 回调操作,反馈给领导情况
 //这个callBack其实也就是老板.深刻体现了,只要你调用我,我就会反过来调用你
 //所以为什么发起调用的一方要实现一个接口(或者也相当于抽象类吧),就是为了便于接收方反过来调用发起方的函数.
 callBack.baoGao(666);
 }
}

也就是类A,实现了call接口,你也可以把它叫call类
call类 调用 B类的方法,B类内部 会调用call类的方法
这就叫你调用我,我调用你.
至于为什么是回调,B类一定会调用call类的某个方法
如果有D类也想和B完成回调,即调用B的时候,被B调用,只需要实现call接口,并且重写方法就行

当然。这只是一个例子,不要就是只死板认为这才是回调。

但是回调一定会有一个标志
就是被调用类里会有一个方法
fun(接口call a){
a.func()
}
这个就是典型的回调标志了,在方法里再反过来调用参数的方法。

举个例子 B类里 静态方法 就是上面这个
然后在A类里使用 B类的fun方法
也未必就是A类去实现接口call
静态方法可以直接用类名调用
B.fun(new call {实现接口方法})

这也是一种回掉呀,只不过参数a其实是一个匿名类
new 了这个接口,实现了函数的匿名类
(接口照理来说是不能new的,不过看到了一种说法,这种匿名内部类写法可以理解为实现了接口,但是没有类名的类,所以其实还是一种类)

Java语言中经常会使用到回调机制,或许只是平时没有注意到吧。比如Android开发中的OnClickListener,当按键触发的时候会执行用户实现的回调方法,从而完成对按键的反馈。

开发过程当中存在某种特殊的业务需求,例如:

描述:

  1. 老板给员工下达了工作任务之后,就去做其他事情了。(此时此 刻,老板不知道需要多长时间完成,不
    会一直等着,而是做自己其他事情)
  2. 员工接收到任务之后,按照要求完成任务
  3. 当员工任务完成的时候,主动的回馈给老板工作情况。
  4. 当员工回馈工作情况的时候,此时此刻老板还在做另外的事情
    二、回调的核心思想
    核心思想图解:

描述:

  1. Boss类 下达任务的方法 调用 Employee类的 完成任务方法
  2. 当Employee类的 完成任务方法执行完毕之后,会主动的调用 老板 Boss类的 callBack() 方法
    三、案例代码实现
  3. 回调的接口 CallBack
/**
 * 定义回调的接口,只需要定义一个报告反馈的方法即可
 */
public interface CallBack {
 // 定义一个报告 反馈的方法
 public void baoGao(int num);
}
  1. 老板类 Boss
/***
 * 定义一个老板Boss类,需要去实现回调的接口 CallBack
 */
public class Boss implements CallBack {
 // 定义下达任务的方法.需要在下达任务的当中调用 员工 完成任务的方法
 public void xiaDaRenWu(Employee e) {
// 当下达任务的时候给出提示.等待着某位员工去完成任务
 System.out.println("Boss下达任务了,等待员工去完成...");
 // 员工去完成任务
 // 由于Boss实现了接口,可以将Boss的对象 this作为参数传递
 e.wanChengRenWu(this);
 }
 // 在报告的方法当中.需要去调用 员工信息
 @Override
 public void baoGao(int num) {
 System.out.println("员工报告回馈信息: " + num);
 }
}
  1. 员工抽象类 Employee
    /**
  • 员工类:由于不知道每个员工的完成方式,将员工定义为抽象
    */
public abstract class Employee {
 // 员工当中完成任务的操作
 public abstract void wanChengRenWu(CallBack callBack);
}
  1. 具体员工类 KoBe
/**
 * 定义具体的员工类KoBe.完成员工任务的操作
 */
public class KoBe extends Employee {
 @Override
 public void wanChengRenWu(CallBack callBack) {
 // 模拟完成工作的情况。需要消耗一定的时间
 try {
 Thread.sleep(4000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 // 回调操作,反馈给领导情况
 callBack.baoGao(666);
 }
}
  1. 测试类 Test
/***
 * 定义测试类完成 测试.创建老板Boss的对象以及 员工对象
 */
public class Test {
 public static void main(String[] args) {
 // 老板的对象
 Boss b = new Boss();
 // 具体员工的对象
 KoBe k = new KoBe();
 // 老板下达任务
 b.xiaDaRenWu(k);
 }
}

最终运行效果(“员工报告反馈信息”等4秒后 才会出现)
Boss下达任务了,等待员工去完成…
员工报告回馈信息: 666
四、 后序
这个例子是一个典型的体现接口作用的例子,有些朋友可能不太明白接口的好处.
当各位朋友不太明白接口好处的朋友可以重点看一下这个例子,多多理解。
总结起来,回调的核心就是 回调方将本身即this传递给调用方.这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。
在这里插入图片描述
命名:由于A调用B的函数,所以A是调用方,B是被调用方,由于A被回调,也是A实现回调函数,所以也叫A为回调方

A 是回调方(调用方),A将自己this 传递给被调用方B,被调用方B在调用完毕后告诉A 所需信息。

类A的a()方法调用了类B的b()方法
类B的b方法执行完毕主动调用类A的callback()方法
回调函数callback()是一个函数,它是一个由回调方(调用方)A自己实现,供被调用方B使用的特殊函数。

在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象。

Java回调函数是一种在Java中实现事件驱动编程的重要机制。回调函数允许您将一个函数作为参数传递给其他函数,并在需要时调用它。回调函数是Java中实现事件驱动编程的重要工具,可以用于处理各种事件,如用户交互、定时器触发、数据读取等。 在Java中,回调函数通常使用接口来实现。接口是一种定义了一组方法的抽象类型,这些方法在实现时可以由任何类来实现。回调函数通常通过实现接口中的方法来实现,并在需要时调用这些方法。 下面是一个简单的回调函数示例: ```java interface Callback { void call(); } public class MyClass { private Callback callback; public void doSomething(Callback callback) { this.callback = callback; // 做一些事情 if (callback != null) { callback.call(); } } } ``` 在上面的示例中,`Callback` 接口定义了一个名为 `call()` 的方法,用于在适当的时候被调用。`MyClass` 类将 `Callback` 接口的实现作为参数传递给 `doSomething()` 方法,并在完成后调用 `call()` 方法。 当您需要使用回调函数时,您可以将一个实现了回调接口的类的实例传递给需要使用回调的方法。该方法将在适当的时候调用回调方法,并将结果传递给该实例的方法或属性。这样,您就可以根据需要执行其他操作或处理回调结果。 使用回调函数可以简化代码并提高代码的可维护性,因为它允许您将复杂的事件处理逻辑封装在单独的方法中,并使用回调函数将其与主程序分离。这使得代码更加清晰和易于理解,并且可以在需要时轻松地扩展和修改代码。 需要注意的是,使用回调函数时需要注意线程安全问题。由于回调函数通常是在其他线程中执行的,因此需要确保在调用回调方法时正确地同步和保护数据,以避免出现并发问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值