java之回调函数
? ? ? ?今天面試碰到了讓我寫一個回調函數,由于之前聽過,但是一直沒寫過,也沒用過所以是一臉懵逼的,今天就來記錄下java的回調函數吧,由易到難。
? ? ? ?案例一:老板與員工
? ? ? ?背景:老板把手中的工作交給了員工去做,自己出去玩了,員工干完之后,通知老板。說也說不清楚,先來看代碼。
? ? ? ?步驟1:先定義一個包含了回調函數的回調接口,方法就是回調函數。
public interface CallBack {//這就是回調函數,回調函數也就是別人干完幫你做的事后,調用你(通知你)。public void call(String info); }? ? ? ?步驟2:定義一個老板類,該類實現了回調接口的回調函數。
//老板 public class Boss implements CallBack{//老板持有員工對象private Emp emp = new Emp();public void play() {System.out.println("我是老板,我去玩了,事情交給你們干了!");}//本來是老板的一部分工作,老板不想做了,交給員工來干。public void doSomething() {//因為老板把工作交給你了,自己當然要出去干其他事,所以開啟異步。new Thread(new Runnable(){public void run() {//傳入當前老板的引用,這樣才能幫老板做他的事。emp.work(Boss.this);}}).start();//老板出去玩了,事情已經交代員工了this.play();}//回調函數,做完老板吩咐的事情后,通知老板。(也就是響應)public void call(String info) {System.out.println(info);} }?
? ? ? ?步驟3:定義一個員工類,該類的一個方法就是自己的工作,也就是幫老板做的事,需要傳入一個老板的引用。
//員工 public class Emp {//老板雇我,就是為了讓我替他工作,所以work方法中的形參為老板的引用。public void work(CallBack callBack) {System.out.println("我接手了老板的這個工作!");System.out.println("正在工作中!");System.out.println("工作做完了!");//工作做完之后呢,需要通知老板,也就是回調callBack.call("老板,您吩咐的工作我完成了!");} }?
? ? ? ?步驟4:寫一個主方法來測試一下。
public class Test {public static void main(String[] args) {Boss boss = new Boss();//把工作交給員工boss.doSomething();} }我是老板,我去玩了,事情交給你們干了! 我接手了老板的這個工作! 正在工作中! 工作做完了! 老板,您吩咐的工作我完成了!? ? ? ?總結:回調對象是work中傳入的參數,回調函數是call方法,本來是老板的事情,老板讓員工去做了,自己去玩了,員工接手老板的工作,完成后執行了回調函數(通知老板),該回調函數是通過老板的引用去執行的。
? ? ? ?是不是看完這個案例后,似乎有點似懂非懂的,那么在來一個案例,請看案例二。
? ? ? ?案例二:小白和小黑是舍友,今天小白的快遞到了,但是呢,小白在外邊兼職,需要小黑去幫忙取快遞,取完快遞后,小黑發了個QQ告訴小白說,我快遞已經幫你取到了。看代碼
? ? ? ? 步驟一:先定義一個回調接口,里面包含回調函數。
? ? ? ??
public interface CallBack {//這就是回調函數,回調函數也就是別人干完幫你做的事后,調用你(通知你)。public void call(String info); }? ? ? ? ?步驟二:新建一個小白類,實現回調接口,并且含有小黑的引用。
//我是小白,同樣也需要實現回調接口 public class SmallWhite implements CallBack{//我持有小黑的引用,因為我需要他的幫助private SmallBlack smallBlack = new SmallBlack();//求助小黑public void help() {System.out.println("我是小白,我的快遞到了,我在外邊兼職,取不了,你幫我取吧!");//開啟多線程,因為小白還要繼續做他的兼職new Thread(new Runnable() {public void run() {//傳入小白的引用smallBlack.getExpress(SmallWhite.this);}}).start();//事情吩咐完畢,小白繼續干活work();}public void work() {System.out.println("繼續兼職!");}public void call(String info) {System.out.println("我知道了,謝謝你!");} }?
? ? ? ? ? ? ?步驟三:新建小黑類,包含一個含有小白引用作為形參的方法,因為要回調它,所以必須含有。
//我是小黑 public class SmallBlack {//取快遞,同樣需要小白的引用.public void getExpress(CallBack callBack) {System.out.println("我是小黑,我去取快遞了!");System.out.println("取到快遞,通知小白!");//回調函數,調用小白的call方法。callBack.call("快遞已經幫你取到了!");} }?
? ? ? ? ? ? ? 步驟四:測試
public class Test {public static void main(String[] args) {SmallWhite smallWhite = new SmallWhite();//叫小黑幫忙去快遞smallWhite.help();} }我是小白,我的快遞到了,我在外邊兼職,取不了,你幫我取吧! 繼續兼職! 我是小黑,我去取快遞了! 取到快遞,通知小白! 我知道了,謝謝你!?
? ? ? ? ? ? 總結:置于有些人會問,貌似這好像不用實現接口吧,那是因為我們只在兩個類之間討論,如果此時小黑的另外一個舍友,小明也需要小黑幫忙取快遞,那么這個接口就是必須的了,因為java只支持單繼承,能實現接口的情況下,優先考慮接口。
? ? ? ? ? ? ?回調其實就是,一些類(類A)實現了回調接口之后,它包含著另外一個類(類B)的引用,類B中含有一個類A作為形參的方法,調用該方法后就能獲得到類A的引用,也就才能調用類A的回調方法。如果不理解的話,直接這么記即可。
總結
- 上一篇: 自觉培养“舆商” 争做成功网商
- 下一篇: pat 团体天梯赛 L2-012. 关于