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