第1章. 故事的緣起
幼師在黑板上寫一個式子 “1 + 1 = ”,由小明同學來填空。
由于已經學習了10以內的加法,小明同學可以完全靠自己來計算這個題目,模擬該過程的代碼如下:
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 }
小明同學在填空(fillBalnk)的時候,直接心算(clacADD)了一下,得出結果是2,并將結果寫在空格里。測試代碼如下:
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 }
運行結果如下:
小明心算:1 + 1 = 2
該過程完全由Student類的實例對象單獨完成,并未涉及回調機制。
第2章. 幼師的找茬
課間,幼師突發奇想在黑板上寫了“168 + 291 = ”讓小明完成,然后回辦公室了。
花擦!為什么所有老師都跟小明過不去?。棵髅鞒V了好不好!這時候小明同學明顯不能再像上面那樣靠心算來完成了,正在懵逼的時候,班上的小紅同學遞過來一個只能計算加法的計算器(奸商啊)?。。。《∶魍瑢W恰好知道怎么用計算器,于是通過計算器計算得到結果并完成了填空。
計算器的代碼為:
1 public class Calculator2 {3 public int add(int a, int b)4 {5 return a + b;6 }7 }
修改Student類,添加使用計算器的方法:
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 }
測試代碼如下:
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 }
運行結果如下:
小明使用計算器:168 + 291 = 459
該過程中仍未涉及到回調機制,但是部分小明的部分工作已經實現了轉移,由計算器來協助實現。
3. 幼師回來了
發現小明完成了3位數的加法,老師覺得小明很聰明,是個可塑之才。于是又在黑板上寫下了“26549 + 16487 = ”,讓小明上課之前完成填空,然后又回辦公室了。
小明看著教室外面撒歡兒的小伙伴,不禁悲從中來。再不出去玩,這個課間就要廢了啊?。。?! 看著小紅再一次遞上來的計算器,小明心生一計:讓小紅代勞。
小明告訴小紅題目是“26549 + 16487 = ”,然后指出填寫結果的具體位置,然后就出去快樂的玩耍了。
這里,不把小紅單獨實現出來,而是把這個只能算加法的計算器和小紅看成一個整體,一個會算結果還會填空的超級計算器。這個超級計算器需要傳的參數是兩個加數和要填空的位置,而這些內容需要小明提前告知,也就是小明要把自己的一部分方法暴漏給小紅,最簡單的方法就是把自己的引用和兩個加數一塊告訴小紅。
因此,超級計算器的add方法應該包含兩個操作數和小明自身的引用,代碼如下:
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 }
小明這邊現在已經不需要心算,也不需要使用計算器了,因此只需要有一個方法可以向小紅尋求幫助就行了,代碼如下:
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 }
測試代碼如下:
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 }
運行結果為:
小明求助小紅計算:26549 + 16487 = 43036
執行流程為:小明通過自身的callHelp方法調用了小紅(new SuperCalculator())的add方法,在調用的時候將自身的引用(this)當做參數一并傳入,小紅在使用計算器得出結果之后,回調了小明的fillBlank方法,將結果填在了黑板上的空格里。
燈燈燈!到這里,回調功能就正式登場了,小明的fillBlank方法就是我們常說的回調函數。
通過這種方式,可以很明顯的看出,對于完成老師的填空題這個任務上,小明已經不需要等待到加法做完且結果填寫在黑板上才能去跟小伙伴們撒歡了,填空這個工作由超級計算器小紅來做了。回調的優勢已經開始體現了。
第4章. 門口的婆婆
幼稚園的門口有一個頭發花白的老婆婆,每天風雨無阻在那里擺著地攤賣一些快過期的垃圾食品。由于年紀大了,腦子有些糊涂,經常算不清楚自己掙了多少錢。有一天,她無意間聽到了小明跟小伙伴們吹噓自己如何在小紅的幫助下與幼師斗智斗勇。于是,婆婆決定找到小紅牌超級計算器來做自己的小幫手,并提供一包衛龍辣條作為報酬。小紅經不住誘惑,答應了。
回看一下上一章的代碼,我們發現小紅牌超級計算器的add方法需要的參數是兩個整型變量和一個Student對象,但是老婆婆她不是學生,是個小商販啊,這里肯定要做修改。這種情況下,我們很自然的會想到繼承和多態。如果讓小明這個學生和老婆婆這個小商販從一個父類進行繼承,那么我們只需要給小紅牌超級計算器傳入一個父類的引用就可以啦。
不過,實際使用中,考慮到java的單繼承,以及不希望把自身太多東西暴漏給別人,這里使用從接口繼承的方式配合內部類來做。
換句話說,小紅希望以后繼續向班里的小朋友們提供計算服務,同時還能向老婆婆提供算賬服務,甚至以后能夠拓展其他人的業務,于是她向所有的顧客約定了一個辦法,用于統一的處理,也就是自己需要的操作數和做完計算之后應該怎么做。這個統一的方法,小紅做成了一個接口,提供給了大家,代碼如下:
1 public interface doJob2 {3 public void fillBlank(int a, int b, int result);4 }
因為靈感來自幫小明填空,因此小紅保留了初心,把所有業務都當做填空(fillBlank)來做。
同時,小紅修改了自己的計算器,使其可以同時處理不同的實現了doJob接口的人,代碼如下:
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 }
小明和老婆婆拿到這個接口之后,只要實現了這個接口,就相當于按照統一的模式告訴小紅得到結果之后的處理辦法,按照之前說的使用內部類來做,代碼如下:
小明的:
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 }
老婆婆的:
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 }
測試程序如下:
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 }
運行結果如下:
小明求助小紅計算:56 + 31 = 87
老婆婆求助小紅算賬:26497 + 11256 = 37753元
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網站標題:java函數回調的理解-創新互聯
網頁地址:http://newbst.com/article40/dggseo.html
成都網站建設公司_創新互聯,為您提供網站建設、小程序開發、外貿網站建設、動態網站、網站設計公司、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯