一、整体流程
- 首先定义一个接口
- 在主函数中传入该接口,使用匿名接口实现
- 定义一个类,入参中包括该接口,并在类方法中调用了接口中的方法
接口回调整体流程逻辑图如下:

接口回调的时序图:

二、 代码示例
1. 定义接口
java
public interface TaskCallback {
void onTaskFinished(String result);
}
2. 接口回调实现(这里变化,实现了类里面调用同一个方法而产生不同的效果,有利于解耦)
java
public class MyCallbackImpl implements TaskCallback {
@Override
public void onTaskFinished(String result) {
System.out.println("回调接收到结果: " + result);
}
}
3. 执行任务类
该类实现主要功能,并通过传入接口的变化,而改变方法中具体的行为
java
public class TaskController {
private TaskCallback callback; // 持有回调接口的引用
public void setCallback(TaskCallback callback) {
this.callback = callback; // 传入实现类的实例
}
public void executeTask() {
System.out.println("任务开始执行...");
// 模拟耗时操作
try { Thread.sleep(2000); } catch (InterruptedException e) {}
String data = "任务执行完毕";
if (callback != null) {
callback.onTaskFinished(data); // 当条件满足时,调用回调方法
}
}
}
4. 主方法
串联整体逻辑
java
public class Main {
public static void main(String[] args) {
TaskController controller = new TaskController();
MyCallbackImpl myCallback = new MyCallbackImpl();
controller.setCallback(myCallback); // 设置回调
controller.executeTask(); // 执行任务
}
}
三、核心意义:为什么要用接口回调而不是直接在类中写死
接口回调的核心在于:实现了解耦
以二中的代码为例,当修改 代码 2 中的接口实现时,传入到 代码 3 中的任务执行类的接口方法就会改变,从而导致了任务执行类行为的变化。
实际上,任务执行类并不关注"传入的是哪个类,实现了什么方法",只关注应该怎么调用这个方法 ,而接口回调使得调用这个方法的方式得到了确定
因此,接口回调实现了接口与调用接口方法的实例类的解耦,修改接口实现时,不需要修改调用它的实例类,保证了代码的灵活性和可扩展性。