在C或者C++中回呼函數的定義:
程式在調用一個函數時,將自己的函數的地址作為參數傳遞給程式調用的函數時(那麼這個自己的函數稱回呼函數)
Java中沒有指標,不能傳遞方法的地址,一般採用介面回調實現:把實現某一介面的類建立的對象的引用賦給該介面聲明的介面變數,那麼該介面變數就可以調用被類實現的介面的方法。
實現回調的原理簡介如下:
首先建立一個回調對象,然後再建立一個控制器對象,將回調對象需要被調用的方法告訴控制器對象。控制器對象負責檢查某個情境是否出現或某個條件是否滿足。當此情境出現或此條件滿足時,自動調用回調對象的方法。
可以舉個現實生活中的例子:
一讀者想借《軟體技術學習與實踐》這本書,但這本書已被其他讀者借走了。於是,讀者與圖書館管理員間發生了以下對話:
讀者:“我把我的電話號碼告訴你,等書一到就馬上通知我。”
管理員:“好的。另一讀者把書還回來後,馬上給您打電話,書我先幫您留著。”
在上述這個情境中,讀者就是“回調對象”,管理員就是“控制器對象”,讀者的電話號碼就是“回調對象的方法”。
詳細的執行個體如下:
1、建立一個回調介面:
1 //回調介面
2 public interface ICallBack
3 {
4 void run();
5 }
複製代碼
2、建立回調介面的實作類別:
1 class CallBackClass implements ICallBack
2 {public void run()
3 {
4 //輸出目前時間
5 System.out.println(System.currentTimeMillis() );
6 }
7 }
複製代碼
3、建立控制類
1 class Controller
2 {
3 public ICallBack CallBackObject = null;// 引用回調對象
4 Scanner input = new Scanner(System.in); //讀取命令列輸入
5 public Controller(ICallBack obj)
6 {
7 this.CallBackObject = obj;
8 }
9 public void Begin()
10 {
11 while(input.next() != null)//判斷是否有輸入
12 {
13 CallBackObject.run();
14 }
15 }
16 }
複製代碼
運行程式:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //建立控制器對象,將提供給它的回調對象傳入
6 Controller obj = new Controller(new CallBackClass());
7 //啟動控制器對象運行
8 obj.Begin();
9 }
10 }
複製代碼
在控制器類中引用了回調對象,因此就能調用回調方法,當控制器進行某些判斷之後(如:監聽按一下滑鼠操作)就會自動調用回調方法!簡易流程圖如下: