再談java回調函數。本站提示廣大學習愛好者:(再談java回調函數)文章只能為提供參考,不一定能成為您想要的結果。以下是再談java回調函數正文
又碰到了回調函數,此次盤算寫上去分享一下。
所謂回調函數,或許在面向對象說話裡叫回調辦法,簡略點講,就是回頭在某個時光(事宜產生)被挪用的函數。
再具體點:就是一個函數A,作為參數,傳入了另外一個函數B,然後被B在某個時光挪用。
這裡可以有疑問了,既然是一個函數挪用另外一個函數,可以在函數體外面挪用啊,為何還要把函數作為參數傳到另外一個函數裡被挪用?況且還有一些說話(好比java)不支撐把函數作為參數。
對的,確切可以在函數體裡挪用另外一個函數,功效上似乎是沒差異的,然則這裡有一個成績,就是你要挪用的這個函數被寫逝世了,也就是說如許函數B只能挪用函數A了,如許假如在另外一個情形下,有個與A分歧完成的函數C也須要在B的某個時辰被挪用,那怎樣辦。
上面持續說回調函數,在c/c++裡,回調函數可使用函數指針作為參數被另外一個函數挪用;在c#裡,可使用拜托,假如是事宜辦法的話,還有event症結字;在python和javascript裡,可以直接把函數當對象傳參,這些說話都很好完成回調函數(辦法),可是, java呢? 先說點題外話,自從學了C#,就不愛好java了,已經一度盤算今後不再用java,可是實際並沒有那末幻想,我如今要做android,所以照樣不克不及放下java,並且明天碰到這個回調函數的成績,也是從java裡碰到的,我小我認為,在這個博客裡湧現的說話,除java外,關於回調,都可以既輕易,又好懂得的完成,然則java,我認為其實不是那樣,否則我也不會來寫這篇博客。
好了持續說,關於java中的回調辦法的完成。這篇博客的重點就是說java的。 在java中,回調辦法是用借用接口來完成的,我在網上找到一句話:
“把完成某一接口的類所創立的對象的援用,賦值給該接口聲明的接口變量,那末該接口變量便可以挪用被完成的接口的辦法”。
很繞哈,簡略說明下:
有一個接口,接口裡有一個辦法(這個辦法就是要回調的辦法):
interface CallBackInterface { void callBackMethod(); }
我們曉得,接口對象不克不及直接用,由於外面的辦法都沒有完成。所以要找個類完成這個接口。
所以如今加一個類,完成這個接口:
interface CallBackInterface { void callBackMethod(); } class CallBackClass implements CallBackInterface{ @Override public void callBackMethod() { System.out.println("hello"); } }
好了,最初一步:把完成了接口的類的對象賦值給聲明的接口變量(我給寫進一個辦法裡了,然後裡面加了個類的殼子):
public class CallBackTest { interface CallBackInterface { void callBackMethod(); } class CallBackClass implements CallBackInterface { @Override public void callBackMethod() { System.out.println("hello"); } } public void showCallBack() { CallBackInterface itfs = new CallBackClass(); itfs.callBackMethod(); } }
如今可以挪用嘗嘗看了:
public class Test { public static void main(String[] args) { new CallBackTest().showCallBack(); } }
沒不測的話,會勝利輸入hello,橫豎我這邊是的.
例子看完了,所以說我做了甚麼呢? 再具體點說,我們有一個要在某一個辦法裡被挪用的辦法(這個辦法就是回調辦法), 後面我們也說了,最好不要直接把想要回調辦法做的事直接寫在挪用辦法裡, 又由於java裡沒法把辦法當作參數傳遞,所以我們只好把這個回調辦法放在了接口裡(為何不是類?不是籠統類?而是接口?你可以本身去找下籠統類與接口的異同,本身處理這個成績)。有接口的話,就要被類完成,然後,只需是給接口的對象付與完成類的對象,這個接口的對象便可以挪用誰人辦法了。懂得這裡的話,有一個重點,就是多態, 這裡用到的多態常識就是,接口的對象可以順遂被子類賦值,而且挪用子類的重寫辦法(類也有相似的概念)。
再多說一點,這裡任何完成了CallbackInterface接口的類,都可以像上面如許放在new前面(就是賦值):
public class CallBackTest { interface CallBackInterface { void callBackMethod(); } class CallBackClass implements CallBackInterface { @Override public void callBackMethod() { System.out.println("hello"); } } class Controller { private CallBackInterface cbitf; // 這個boolean只是為了模仿有事宜,沒啥適用價值 public boolean somethingHappend; // 這裡確切可以直接把CallBackClass做參數,並且免卻接口的界說 // 然則如許做的話,就像是回調函數直接寫在了挪用函數裡一樣 // 不明確的話就好好懂得下"商定"和"挪用者不論回調函數是怎樣完成的"吧 public Controller(CallBackInterface itfs) { somethingHappend = true; this.cbitf = itfs; } public void doSomething() { if(somethingHappend) { cbitf.callBackMethod(); } } } public void showCallBack() { CallBackClass cbc = new CallBackClass(); Controller ctrlr = new Controller(cbc); ctrlr.doSomething(); // 其實下面也能夠如許寫在一行裡 // new Controller(new CallBackClass()).doSomething(); } }
最初多說一點,其實這類運用在android裡會常常碰到,我就是在學android的時刻碰到的。
以上就是小我關於回調函數的懂得和應用辦法了,願望年夜家可以或許愛好。