欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

再談java回調(diào)函數(shù)

 更新時間:2015年07月29日 10:25:02   投稿:hebedich  
個人對于回調(diào)函數(shù)的理解就是回調(diào)函數(shù)就是回頭再調(diào)用的函數(shù),哈哈,下面我們來詳細(xì)探討下回調(diào)函數(shù)。

又遇到了回調(diào)函數(shù),這次打算寫下來分享一下。

所謂回調(diào)函數(shù),或者在面向?qū)ο笳Z言里叫回調(diào)方法,簡單點講,就是回頭在某個時間(事件發(fā)生)被調(diào)用的函數(shù)。

再詳細(xì)點:就是一個函數(shù)A,作為參數(shù),傳入了另一個函數(shù)B,然后被B在某個時間調(diào)用。

這里可以有疑問了,既然是一個函數(shù)調(diào)用另一個函數(shù),可以在函數(shù)體里面調(diào)用啊,為什么還要把函數(shù)作為參數(shù)傳到另一個函數(shù)里被調(diào)用?何況還有一些語言(比如java)不支持把函數(shù)作為參數(shù)。

對的,確實可以在函數(shù)體里調(diào)用另一個函數(shù),功能上好像是沒差別的,但是這里有一個問題,就是你要調(diào)用的這個函數(shù)被寫死了,也就是說這樣函數(shù)B只能調(diào)用函數(shù)A了,這樣如果在另一個情景下,有個與A不同實現(xiàn)的函數(shù)C也需要在B的某個時刻被調(diào)用,那怎么辦。

下面繼續(xù)說回調(diào)函數(shù),在c/c++里,回調(diào)函數(shù)可以使用函數(shù)指針作為參數(shù)被另一個函數(shù)調(diào)用;在c#里,可以使用委托,如果是事件方法的話,還有event關(guān)鍵字;在python和javascript里,可以直接把函數(shù)當(dāng)對象傳參,這些語言都很好實現(xiàn)回調(diào)函數(shù)(方法),可是, java呢? 先說點題外話,自從學(xué)了C#,就不喜歡java了,曾經(jīng)一度打算以后不再用java,可是現(xiàn)實并沒有那么理想,我現(xiàn)在要做android,所以還是不能放下java,而且今天遇到這個回調(diào)函數(shù)的問題,也是從java里遇到的,我個人覺得,在這個博客里出現(xiàn)的語言,除了java外,對于回調(diào),都可以既容易,又好理解的實現(xiàn),但是java,我覺得并不是那樣,不然我也不會來寫這篇博客。

好了繼續(xù)說,關(guān)于java中的回調(diào)方法的實現(xiàn)。這篇博客的重點就是說java的。 在java中,回調(diào)方法是用借用接口來實現(xiàn)的,我在網(wǎng)上找到一句話:

“把實現(xiàn)某一接口的類所創(chuàng)建的對象的引用,賦值給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被實現(xiàn)的接口的方法”。
很繞哈,簡單解釋下:
有一個接口,接口里有一個方法(這個方法就是要回調(diào)的方法):

interface CallBackInterface {
  void callBackMethod();
}

我們知道,接口對象不能直接用,因為里面的方法都沒有實現(xiàn)。所以要找個類實現(xiàn)這個接口。
所以現(xiàn)在加一個類,實現(xiàn)這個接口:

interface CallBackInterface {
  void callBackMethod();
}

class CallBackClass implements CallBackInterface{

  @Override
  public void callBackMethod() {
    System.out.println("hello");
  }
}

好了,最后一步:把實現(xiàn)了接口的類的對象賦值給聲明的接口變量(我給寫進一個方法里了,然后外面加了個類的殼子):

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();
  }
}

現(xiàn)在可以調(diào)用試試看了:

public class Test {
  public static void main(String[] args) {
    new CallBackTest().showCallBack();
  }
}

沒意外的話,會成功輸出hello,反正我這邊是的.

例子看完了,所以說我做了什么呢? 再詳細(xì)點說,我們有一個要在某一個方法里被調(diào)用的方法(這個方法就是回調(diào)方法), 前面我們也說了,最好不要直接把想要回調(diào)方法做的事直接寫在調(diào)用方法里, 又因為java里沒法把方法當(dāng)做參數(shù)傳遞,所以我們只好把這個回調(diào)方法放在了接口里(為什么不是類?不是抽象類?而是接口?你可以自己去找下抽象類與接口的異同,自己解決這個問題)。有接口的話,就要被類實現(xiàn),然后,只要是給接口的對象賦予實現(xiàn)類的對象,這個接口的對象就可以調(diào)用那個方法了。理解這里的話,有一個重點,就是多態(tài), 這里用到的多態(tài)知識就是,接口的對象可以順利被子類賦值,并且調(diào)用子類的重寫方法(類也有類似的概念)。

再多說一點,這里任何實現(xiàn)了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做參數(shù),而且省掉接口的定義
    // 但是這樣做的話,就像是回調(diào)函數(shù)直接寫在了調(diào)用函數(shù)里一樣
    // 不明白的話就好好理解下"約定"和"調(diào)用者不管回調(diào)函數(shù)是怎么實現(xiàn)的"吧
    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();
  }
}

最后多說一點,其實這種應(yīng)用在android里會經(jīng)常遇到,我就是在學(xué)android的時候遇到的。

以上就是個人對于回調(diào)函數(shù)的理解和使用方法了,希望大家能夠喜歡。

相關(guān)文章

  • JAVA-4NIO之Channel之間的數(shù)據(jù)傳輸方法

    JAVA-4NIO之Channel之間的數(shù)據(jù)傳輸方法

    下面小編就為大家?guī)硪黄狫AVA-4NIO之Channel之間的數(shù)據(jù)傳輸方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 圖文詳解SpringBoot中Log日志的集成

    圖文詳解SpringBoot中Log日志的集成

    這篇文章主要給大家介紹了關(guān)于SpringBoot中Log日志的集成的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-12-12
  • 淺談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題

    淺談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題

    下面小編就為大家?guī)硪黄獪\談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java設(shè)計模式之java原型模式詳解

    Java設(shè)計模式之java原型模式詳解

    這篇文章主要介紹了Java設(shè)計模式之原型模式詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • Springboot中如何使用過濾器校驗PSOT類型請求參數(shù)內(nèi)容

    Springboot中如何使用過濾器校驗PSOT類型請求參數(shù)內(nèi)容

    在Springboot中創(chuàng)建過濾器,用來過濾所有POST類型請求并獲取body中的參數(shù)進行校驗內(nèi)容是否合法,該方法僅適用于POST類型請求,本文給大家介紹Springboot中如何使用過濾器校驗PSOT類型請求參數(shù)內(nèi)容,感興趣的朋友一起看看吧
    2023-08-08
  • 詳解Java中LinkedHashMap

    詳解Java中LinkedHashMap

    本文主要介紹了Java中LinkedHashMap的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • 詳解Java中String,StringBuffer和StringBuilder的使用

    詳解Java中String,StringBuffer和StringBuilder的使用

    這篇文章主要為大家詳細(xì)介紹了Java中String,StringBuffer和StringBuilder三者的區(qū)別以及使用,文中的少了講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • Java鏈表超詳細(xì)講解(通俗易懂,含源碼)

    Java鏈表超詳細(xì)講解(通俗易懂,含源碼)

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈接次序?qū)崿F(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于Java鏈表超詳細(xì)講解的相關(guān)資料,本文講解的內(nèi)容通俗易懂,含源碼,需要的朋友可以參考下
    2022-09-09
  • Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實現(xiàn)代碼

    Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實現(xiàn)代碼

    這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • springboot+websocket實現(xiàn)并發(fā)搶紅包功能

    springboot+websocket實現(xiàn)并發(fā)搶紅包功能

    本文主要介紹了springboot+websocket實現(xiàn)并發(fā)搶紅包功能,主要包含了4種步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論