Java 回調機制深度解析:從生活場景到代碼實現的完整圖解
生活類比
- 教師(調用方) → 學生 A(被調用方,能力不足) → 學生 B(具備能力)。
- A 請求 B 幫忙 → B 計算完成 → 回調 告知 A 結果 → A 向教師匯報。
四大核心角色
- Callback 接口:定義回調契約
void solve(int result)。
- Class A (StudentA):實現 Callback,持有 B 的引用,發起異步請求。
- Class B (StudentB):執行耗時任務,完成後調用
callback.solve(result)。
- Client (CallBackTest):組裝 A、B,啟動流程。
代碼實現
// 1. 回調接口
public interface CallBack { void solve(int result); }
// 2. A 類:實現接口,持有 B 引用
public class StudentA implements CallBack {
private StudentB mStuB;
public StudentA(StudentB stuB) { this.mStuB = stuB; }
public void askQuestion(final int a, final int b) {
new Thread(() -> mStuB.executeMessage(this, a, b)).start(); // 異步
}
@Override public void solve(int result) { System.out.println("結果:" + result); }
}
// 3. B 類:執行任務,回調 A
public class StudentB {
public void executeMessage(CallBack cb, int a, int b) {
int result = a + b;
cb.solve(result); // 關鍵:父類引用指向子類對象,多態調用
}
}
// 4. 啟動
public class CallBackTest {
public static void main(String[] args) {
StudentB b = new StudentB();
StudentA a = new StudentA(b);
a.askQuestion(1, 1); // 輸出:結果:2
}
}
關鍵點總結
- 雙向依賴:A 持有 B 引用(正向),B 持有 Callback 引用(反向,實為 A)。
- 多態:B 僅依賴 Callback 接口,解耦具體實現。
- 異步友好:配合 Thread/Executor 實現非阻塞回調,避免主線程等待。
- 應用場景:事件監聽、異步 IO 完成通知、框架擴展點(Spring InitializingBean、ServletContextListener)。
參考延伸