程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 再談java回調函數

再談java回調函數

編輯:關於JAVA

再談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的時刻碰到的。

以上就是小我關於回調函數的懂得和應用辦法了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved