Java的回调解释
假设有两个类,分别是A和B,在A中有一个方法a(),B中有一个方法b();在A里面调用B中的方法b(),而方法b()中又调用了A类中的方法
同步回调
以小明和小王去吃饭,小王要换衣服才能去吃饭为例
吃饭的接口
public interface EatRice {
public void eat(String food);
}
A类
public class XiaoMing implements EatRice{//要继承EatRice
//小明和小王一起去吃饭
public void eatFood() {
XiaoWang xw = new XiaoWang();
//A中a()调用B的b()方法
xw.washFace("吃黄焖鸡", this);//this指的是小明这个类实现的EatRice接口
}
@Override
public void eat(String food) {
System.out.println("小明和小王去"+food)
}
}
B类
public class XiaoWang{
public void washFace(String food,EatRice er) {
System.out.println("小王要换衣服")
//B调用了A的方法
er.eat(food);
}
}
打印结果
小王要换衣服
小明和小王去吃黄焖鸡
异步回调
还以小明和小王去吃饭为例不过在小王换衣服时小明同时在玩手机
其他类都不变B类修改一下
public class XiaoWang{
protected EatRice er;
public void setEatRiceListener(EatRice er, String food) {
this.er = er;
washFace(food);
}
public void washFace(String food) {
System.out.print("小王要换衣服");
new Thread(new Runnable() {
@Override
public void run() {
try {
//小王换衣服是小明在玩手机,开启线程同步
play();
Thread.sleep(5000);
System.out.print("5秒后小王换完衣服")
//B调用A的方法
er.eat(food);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
//小明玩手机
public void play() {
System.out.println(" 小明在玩手机");
}
}
打印结果
小王要换衣服小明在玩手机
5秒后小王换完衣服小明和小王去吃黄焖鸡