溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java函數(shù)回調(diào)的理解

發(fā)布時間:2020-08-10 17:36:27 來源:網(wǎng)絡(luò) 閱讀:415 作者:wx5955e325d6bfb 欄目:軟件技術(shù)

第1章. 故事的緣起

幼師在黑板上寫一個式子 “1 + 1 = ”,由小明同學(xué)來填空。

由于已經(jīng)學(xué)習(xí)了10以內(nèi)的加法,小明同學(xué)可以完全靠自己來計算這個題目,模擬該過程的代碼如下:

java函數(shù)回調(diào)的理解

 1 public class Student 2 { 3     private String name = null; 4  5     public Student(String name) 6     { 7         // TODO Auto-generated constructor stub 8         this.name = name; 9     }10     11     public void setName(String name)12     {13         this.name = name;14     }15     16     private int calcADD(int a, int b)17     {18         return a + b;19     }20     21     public void fillBlank(int a, int b)22     {23         int result = calcADD(a, b);24         System.out.println(name + "心算:" + a + " + " + b + " = " + result);25     }26 }

java函數(shù)回調(diào)的理解

小明同學(xué)在填空(fillBalnk)的時候,直接心算(clacADD)了一下,得出結(jié)果是2,并將結(jié)果寫在空格里。測試代碼如下:

java函數(shù)回調(diào)的理解

 1 public class Test 2 { 3     public static void main(String[] args) 4     { 5         int a = 1; 6         int b = 1; 7         Student s = new Student("小明"); 8         s.fillBlank(a, b); 9     }10 }

java函數(shù)回調(diào)的理解

 

運(yùn)行結(jié)果如下:

小明心算:1 + 1 = 2

該過程完全由Student類的實(shí)例對象單獨(dú)完成,并未涉及回調(diào)機(jī)制。

第2章. 幼師的找茬

課間,幼師突發(fā)奇想在黑板上寫了“168 + 291 = ”讓小明完成,然后回辦公室了。

花擦!為什么所有老師都跟小明過不去?。棵髅鞒V了好不好!這時候小明同學(xué)明顯不能再像上面那樣靠心算來完成了,正在懵逼的時候,班上的小紅同學(xué)遞過來一個只能計算加法的計算器(奸商?。。。?!而小明同學(xué)恰好知道怎么用計算器,于是通過計算器計算得到結(jié)果并完成了填空。

計算器的代碼為:

java函數(shù)回調(diào)的理解

1 public class Calculator2 {3     public int add(int a, int b)4     {5         return a + b;6     }7 }

java函數(shù)回調(diào)的理解

修改Student類,添加使用計算器的方法:

java函數(shù)回調(diào)的理解

 1 public class Student 2 { 3     private String name = null; 4  5     public Student(String name) 6     { 7         // TODO Auto-generated constructor stub 8         this.name = name; 9     }10     11     public void setName(String name)12     {13         this.name = name;14     }15     16     @SuppressWarnings("unused")17     private int calcADD(int a, int b)18     {19         return a + b;20     }21     22     private int useCalculator(int a, int b)23     {24         return new Calculator().add(a, b);25     }26     27     public void fillBlank(int a, int b)28     {29         int result = useCalculator(a, b);30         System.out.println(name + "使用計算器:" + a + " + " + b + " = " + result);31     }32 }

java函數(shù)回調(diào)的理解

測試代碼如下:

java函數(shù)回調(diào)的理解

 1 public class Test 2 { 3     public static void main(String[] args) 4     { 5         int a = 168; 6         int b = 291; 7         Student s = new Student("小明"); 8         s.fillBlank(a, b); 9     }10 }

java函數(shù)回調(diào)的理解

運(yùn)行結(jié)果如下:

小明使用計算器:168 + 291 = 459

該過程中仍未涉及到回調(diào)機(jī)制,但是部分小明的部分工作已經(jīng)實(shí)現(xiàn)了轉(zhuǎn)移,由計算器來協(xié)助實(shí)現(xiàn)。

3. 幼師回來了

發(fā)現(xiàn)小明完成了3位數(shù)的加法,老師覺得小明很聰明,是個可塑之才。于是又在黑板上寫下了“26549 + 16487 = ”,讓小明上課之前完成填空,然后又回辦公室了。

小明看著教室外面撒歡兒的小伙伴,不禁悲從中來。再不出去玩,這個課間就要廢了?。。。。?看著小紅再一次遞上來的計算器,小明心生一計:讓小紅代勞。

小明告訴小紅題目是“26549 + 16487 = ”,然后指出填寫結(jié)果的具體位置,然后就出去快樂的玩耍了。

這里,不把小紅單獨(dú)實(shí)現(xiàn)出來,而是把這個只能算加法的計算器和小紅看成一個整體,一個會算結(jié)果還會填空的超級計算器。這個超級計算器需要傳的參數(shù)是兩個加數(shù)和要填空的位置,而這些內(nèi)容需要小明提前告知,也就是小明要把自己的一部分方法暴漏給小紅,最簡單的方法就是把自己的引用和兩個加數(shù)一塊告訴小紅。

因此,超級計算器的add方法應(yīng)該包含兩個操作數(shù)和小明自身的引用,代碼如下:

java函數(shù)回調(diào)的理解

1 public class SuperCalculator2 {3     public void add(int a, int b, Student  xiaoming)4     {5         int result = a + b;6         xiaoming.fillBlank(a, b, result);7     }8 }

java函數(shù)回調(diào)的理解

小明這邊現(xiàn)在已經(jīng)不需要心算,也不需要使用計算器了,因此只需要有一個方法可以向小紅尋求幫助就行了,代碼如下:

java函數(shù)回調(diào)的理解

 1 public class Student 2 { 3     private String name = null; 4  5     public Student(String name) 6     { 7         // TODO Auto-generated constructor stub 8         this.name = name; 9     }10     11     public void setName(String name)12     {13         this.name = name;14     }15     16     public void callHelp (int a, int b)17     {18         new SuperCalculator().add(a, b, this);19     }20     21     public void fillBlank(int a, int b, int result)22     {23         System.out.println(name + "求助小紅計算:" + a + " + " + b + " = " + result);24     }25 }

java函數(shù)回調(diào)的理解

測試代碼如下:

java函數(shù)回調(diào)的理解

 1 public class Test 2 { 3     public static void main(String[] args) 4     { 5         int a = 26549; 6         int b = 16487; 7         Student s = new Student("小明"); 8         s.callHelp(a, b); 9     }10 }

java函數(shù)回調(diào)的理解

運(yùn)行結(jié)果為:

小明求助小紅計算:26549 + 16487 = 43036

執(zhí)行流程為:小明通過自身的callHelp方法調(diào)用了小紅(new SuperCalculator())的add方法,在調(diào)用的時候?qū)⒆陨淼囊茫╰his)當(dāng)做參數(shù)一并傳入,小紅在使用計算器得出結(jié)果之后,回調(diào)了小明的fillBlank方法,將結(jié)果填在了黑板上的空格里。

燈燈燈!到這里,回調(diào)功能就正式登場了,小明的fillBlank方法就是我們常說的回調(diào)函數(shù)。

通過這種方式,可以很明顯的看出,對于完成老師的填空題這個任務(wù)上,小明已經(jīng)不需要等待到加法做完且結(jié)果填寫在黑板上才能去跟小伙伴們?nèi)鰵g了,填空這個工作由超級計算器小紅來做了?;卣{(diào)的優(yōu)勢已經(jīng)開始體現(xiàn)了。

第4章. 門口的婆婆

幼稚園的門口有一個頭發(fā)花白的老婆婆,每天風(fēng)雨無阻在那里擺著地攤賣一些快過期的垃圾食品。由于年紀(jì)大了,腦子有些糊涂,經(jīng)常算不清楚自己掙了多少錢。有一天,她無意間聽到了小明跟小伙伴們吹噓自己如何在小紅的幫助下與幼師斗智斗勇。于是,婆婆決定找到小紅牌超級計算器來做自己的小幫手,并提供一包衛(wèi)龍辣條作為報酬。小紅經(jīng)不住誘惑,答應(yīng)了。

回看一下上一章的代碼,我們發(fā)現(xiàn)小紅牌超級計算器的add方法需要的參數(shù)是兩個整型變量和一個Student對象,但是老婆婆她不是學(xué)生,是個小商販啊,這里肯定要做修改。這種情況下,我們很自然的會想到繼承和多態(tài)。如果讓小明這個學(xué)生和老婆婆這個小商販從一個父類進(jìn)行繼承,那么我們只需要給小紅牌超級計算器傳入一個父類的引用就可以啦。

不過,實(shí)際使用中,考慮到j(luò)ava的單繼承,以及不希望把自身太多東西暴漏給別人,這里使用從接口繼承的方式配合內(nèi)部類來做。

換句話說,小紅希望以后繼續(xù)向班里的小朋友們提供計算服務(wù),同時還能向老婆婆提供算賬服務(wù),甚至以后能夠拓展其他人的業(yè)務(wù),于是她向所有的顧客約定了一個辦法,用于統(tǒng)一的處理,也就是自己需要的操作數(shù)和做完計算之后應(yīng)該怎么做。這個統(tǒng)一的方法,小紅做成了一個接口,提供給了大家,代碼如下:

1 public interface doJob2 {3     public void fillBlank(int a, int b, int result);4 }

因?yàn)殪`感來自幫小明填空,因此小紅保留了初心,把所有業(yè)務(wù)都當(dāng)做填空(fillBlank)來做。

同時,小紅修改了自己的計算器,使其可以同時處理不同的實(shí)現(xiàn)了doJob接口的人,代碼如下:

java函數(shù)回調(diào)的理解

1 public class SuperCalculator2 {3     public void add(int a, int b, doJob  customer)4     {5         int result = a + b;6         customer.fillBlank(a, b, result);7     }8 }

java函數(shù)回調(diào)的理解

小明和老婆婆拿到這個接口之后,只要實(shí)現(xiàn)了這個接口,就相當(dāng)于按照統(tǒng)一的模式告訴小紅得到結(jié)果之后的處理辦法,按照之前說的使用內(nèi)部類來做,代碼如下:

小明的:

java函數(shù)回調(diào)的理解

 1 public class Student 2 { 3     private String name = null; 4  5     public Student(String name) 6     { 7         // TODO Auto-generated constructor stub 8         this.name = name; 9     }10     11     public void setName(String name)12     {13         this.name = name;14     }15     16     public class doHomeWork implements doJob17     {18 19         @Override20         public void fillBlank(int a, int b, int result)21         {22             // TODO Auto-generated method stub23             System.out.println(name + "求助小紅計算:" + a + " + " + b + " = " + result);24         }25         26     }27     28     public void callHelp (int a, int b)29     {30         new SuperCalculator().add(a, b, new doHomeWork());31     }32 }

java函數(shù)回調(diào)的理解

老婆婆的:

java函數(shù)回調(diào)的理解

 1 public class Seller 2 { 3     private String name = null; 4  5     public Seller(String name) 6     { 7         // TODO Auto-generated constructor stub 8         this.name = name; 9     }10     11     public void setName(String name)12     {13         this.name = name;14     }15     16     public class doHomeWork implements doJob17     {18 19         @Override20         public void fillBlank(int a, int b, int result)21         {22             // TODO Auto-generated method stub23             System.out.println(name + "求助小紅算賬:" + a + " + " + b + " = " + result + "元");24         }25         26     }27     28     public void callHelp (int a, int b)29     {30         new SuperCalculator().add(a, b, new doHomeWork());31     }32 }

java函數(shù)回調(diào)的理解

測試程序如下:

java函數(shù)回調(diào)的理解

 1 public class Test 2 { 3     public static void main(String[] args) 4     { 5         int a = 56; 6         int b = 31; 7         int c = 26497; 8         int d = 11256; 9         Student s1 = new Student("小明");10         Seller s2 = new Seller("老婆婆");11         12         s1.callHelp(a, b);13         s2.callHelp(c, d);14     }15 }

java函數(shù)回調(diào)的理解

運(yùn)行結(jié)果如下:

小明求助小紅計算:56 + 31 = 87
老婆婆求助小紅算賬:26497 + 11256 = 37753元


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI