標籤:
以前經常看見"回調方法(或回呼函數)"一詞,但是沒有瞭解過是什麼意思,更不知道用法。現在從網路上搜集了一些很好的資料,自己又整理一下,作為自己的筆記,也作為學習過程中的一個小腳印。(這篇筆記大部分來自他人的總結,提問,回答等,特此聲明)
下面從1.什麼是回呼函數?2.回呼函數的作用?3.回呼函數的具體實現?(通過執行個體解決)三個方面進行闡述:
一. 什麼是回呼函數?
1. 維基百科定義(看完本片文章再來理解):在電腦程式設計中,回呼函數(簡稱回調),是指通過函數參數傳遞到其他代碼的,某一塊可執行代碼的引用。這一設計允許底層代碼調用在高層定義的子程式。
2. 其他定義(易於理解,推薦):所謂的回調,就是程序員A寫了一段程式(程式a),其中預留有回呼函數介面,並封裝好了該程式。程式員B要讓a調用自己的程式b中的一個方法,於是,他通過a中的介面回調自己b中的方法。(常式看第三部分)
3. 回調的核心:把一段程式作為成員變數,在特定場合使用該段程式。(這種成員變數在java中是通過介面實現的)
二. 回呼函數的作用?
回調方法是把功能定義和功能實現分離的一種手段,是一種松耦合的設計思想。(該部分目前先這樣理解,待補充)
三. 回呼函數的具體實現?
在Java裡面,我們使用介面來實現回調。
下面是例子:
1.首先定義一個類Caller,按照上面的定義就是程式員A寫的程式a,這個類裡面儲存一個介面引用。
public class Caller { private MyCallInterface callInterface; public Caller() {
}
public void setCallFunc(MyCallInterface callInterface) { this.callInterface = callInterface; } public void call() { callInterface.printName(); }}
對以上代碼中setCallFunc()方法的解釋:回調就是把代碼作為對象傳進去,那麼怎麼把代碼傳進去呢,當然需要做成一個類,類中的某個方法就是這段代碼。那麼對於調用者來說就有兩點,一個是怎麼得到這個類,一個是怎麼知道是什麼方法。對於第一點,就是你看到的set方法,將外部類作為屬性送進來。至於第二點,就需要定義一個介面,然後調用介面中定義的方法就行。
2. 當然需要介面的定義,為了方便程序員B根據我的定義編寫程式實現介面。
public interface MyCallInterface { public void printName();}
3.第三是定義程式員B寫的程式b。
public class Client implements MyCallInterface { @Override public void printName() { System.out.println("This is the client printName method"); }}
4. 測試如下
public class Test { public static void main(String[] args) { Caller caller = new Caller(); caller.setCallFunc(new Client()); caller.call(); }}
看到這裡應該明白什麼是回調了,有些文章介紹的很好,但是剛開始沒看明白,是因為把第3步的類省略,直接寫成匿名類了。
5. 在測試方法中直接使用匿名類,省去第3步。
public class Test { public static void main(String[] args) { Caller caller = new Caller();// caller.setCallFunc(new Client()); caller.setCallFunc(new MyCallInterface() { public void printName() { System.out.println("This is the client printName method"); } }); caller.call(); }}
java回調方法之理解