1. 程式人生 > >java 回撥函式詳解

java 回撥函式詳解

在C或者C++中回撥函式的定義:

程式在呼叫一個函式時,將自己的函式的地址作為引數傳遞給程式呼叫的函式時(那麼這個自己的函式稱回撥函式)

Java中沒有指標,不能傳遞方法的地址,一般採用介面回撥實現把實現某一介面的類建立的物件的引用賦給該介面宣告的介面變數,那麼該介面變數就可以呼叫被類實現的介面的方法。

實現回撥的原理簡介如下

首先建立一個回撥物件,然後再建立一個控制器物件,將回調物件需要被呼叫的方法告訴控制器物件。控制器物件負責檢查某個場景是否出現或某個條件是否滿足。當此場景出現或此條件滿足時,自動呼叫回撥物件的方法

可以舉個現實生活中的例子:

一讀者想借《軟體技術學習與實踐》這本書,但這本書已被其他讀者借走了。於是,讀者與圖書館管理員間發生了以下對話:

讀者:“我把我的電話號碼告訴你,等書一到就馬上通知我。”

管理員:“好的。另一讀者把書還回來後,馬上給您打電話,書我先幫您留著。”

在上述這個場景中,讀者就是“回撥物件”,管理員就是“控制器物件”,讀者的電話號碼就是“回撥物件的方法”

詳細的例項如下:

1、建立一個回撥介面:

1 //回撥介面2 publicinterface ICallBack
3 
4 void run();
5 }

2、建立回撥介面的實現類:

複製程式碼 1 class CallBackClass implements ICallBack
2 {publicvoid 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 publicvoid Begin()
10 {
11 while(input.next() !=null)//判斷是否有輸入12 {
13 CallBackObject.run();
14 }
15 }
16 } 複製程式碼

執行程式:

複製程式碼 1 class Program
2 {
3 staticvoid Main(string[] args)
4 {
5 //建立控制器物件,將提供給它的回撥物件傳入6 Controller obj =new Controller(new CallBackClass());
7 //啟動控制器物件執行8 obj.Begin();
9 }
10 } 複製程式碼

在控制器類中引用了回撥物件,因此就能呼叫回撥方法,當控制器進行某些判斷之後(如:監聽滑鼠單擊操作)就會自動呼叫回撥方法!簡易流程圖如下: