文章目录
前言
本文是作者在学习接口回调时看到
https://blog.csdn.net/fengye454545/article/details/80198446
帖子中后,对其内容的理解和补充,仅供学习参考,如有错误感谢指正。
一、回调简单理解
小明和小李要一起去吃饭,但小李要先洗个脸。那么正常流程应该是小李先去洗个脸,然后通知小明一起去吃饭。
下面是一个简单的例子,小明等效于A,小李等效于B,但是这并不能算是回调,因为最后一起去吃饭的eat方法其实只是在A中直接调用,也就是A调用B的washFace,再调用A自己的eat
//等效类A
public class Ming {
public void eatFood() {
Li li = new Li();
li.washFace();//在A中调用B的方法
//洗完脸后再去吃饭
eat();
}
public void eat() {
System.out.println("小明和小李一起吃饭");
}
}
//等效类B
public class Li {
public void washFace() {
System.out.println("小李洗脸");
}
}
那么怎么样才能算是回调呢,先理一下逻辑,回调回调,我们首先在A中调用了B的方法,那么之后应当在B中再次调用A的方法,这才算是完成回调。简单点就是在小明A中调用了小李B的washFace,那么完成后应当在小李B的washFace调用小明A的eat方法。
更改后 代码如下
小明A
//等效类A
public class Ming {
public void eatFood() {
System.out.println("进入A eatFood()");
Li li = new Li();
li.washFace();//在A中调用B的方法
}
public void eat() {
System.out.println("进入A eat()");
System.out.println("小明和小李一起吃饭");
}
}
小李B
//等效类B
public class Li {
public void washFace() {
System.out.println("进入B washFace()");
System.out.println("小李洗脸");
Ming ming = new Ming();
ming.eat();//在B中调用A的方法
}
}
测试
public class Main {
public static void main(String[] args) {
Ming ming = new Ming();
ming.eatFood();
}
}
输出结果
这里为了方便从逻辑上整理,因此我加入了具体进入哪个类哪个方法的输出。
这里跟前面代码最大的区别在于,最后我们调用eat方法并不是在A本身调用,而是通过在B中实例化A的对象调用。
二、Java中用接口实现回调
1.实现接口回调
1.1同步回调
还是实现上面的功能,这次我们选择Java实现回调的常规方式,也就是接口来实现回调,也就是所谓的接口回调。(我们先不管为啥要使用接口这种方式来实现)
那首先肯定是创建一个接口,那这接口里面写啥呢?仔细寻思一下这一整个流程的方法,单属于他们自己的就单拎开不管,然后我们发现他们有一个非常显眼的交互动作:小李洗完脸后通知小明,然后两个人一起去恰饭。这不就明白了。
这是接口内定义的内容 一个一起eat的方法
public interface Eat {
public void eat();
}
eat()里是Ming实现接口的具体内容,跟我们一开始说的没啥区别,另外一个eatFood方法我们进行了一些更改,先不管,看完Li之后一起解释。
//等效类A
public class Ming implements Eat{
public void eatFood() {
System.out.println("进入A eatFood()");
Li li = new Li();
li.washFace(this);