最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

interface CallBackInterface {
  void callBackMethod();
}

我們知道,接口對(duì)象不能直接用,因?yàn)槔锩娴姆椒ǘ紱](méi)有實(shí)現(xiàn)。所以要找個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口。
所以現(xiàn)在加一個(gè)類(lèi),實(shí)現(xiàn)這個(gè)接口:

interface CallBackInterface {
  void callBackMethod();
}

class CallBackClass implements CallBackInterface{

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

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

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

沒(méi)意外的話(huà),會(huì)成功輸出hello,反正我這邊是的.

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

再多說(shuō)一點(diǎn),這里任何實(shí)現(xiàn)了CallbackInterface接口的類(lèi),都可以像下面這樣放在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;
    // 這個(gè)boolean只是為了模擬有事件,沒(méi)啥實(shí)用價(jià)值
    public boolean somethingHappend;
    // 這里確實(shí)可以直接把CallBackClass做參數(shù),而且省掉接口的定義
    // 但是這樣做的話(huà),就像是回調(diào)函數(shù)直接寫(xiě)在了調(diào)用函數(shù)里一樣
    // 不明白的話(huà)就好好理解下"約定"和"調(diào)用者不管回調(diào)函數(shù)是怎么實(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();
    // 其實(shí)上面也可以這樣寫(xiě)在一行里
    // new Controller(new CallBackClass()).doSomething();
  }
}

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

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

相關(guān)文章

  • Java中的強(qiáng)引用,軟引用,弱引用,虛引用的作用介紹

    Java中的強(qiáng)引用,軟引用,弱引用,虛引用的作用介紹

    這篇文章主要介紹了Java中的強(qiáng)引用,軟引用,弱引用,虛引用的作用,下文內(nèi)容具有一定的知識(shí)參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例(分享)

    java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例(分享)

    下面小編就為大家分享一篇java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java 操作gis geometry類(lèi)型數(shù)據(jù)方式

    java 操作gis geometry類(lèi)型數(shù)據(jù)方式

    這篇文章主要介紹了java 操作gis geometry類(lèi)型數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談Java線(xiàn)程池是如何運(yùn)行的

    淺談Java線(xiàn)程池是如何運(yùn)行的

    這篇文章主要介紹了淺談Java線(xiàn)程池是如何運(yùn)行的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MyBatis中OGNL的使用教程詳解

    MyBatis中OGNL的使用教程詳解

    有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL卻不知道在MyBatis中如何使用,下面這篇文章主要介紹了MyBatis中OGNL的使用教程,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • java 讀取網(wǎng)頁(yè)內(nèi)容的實(shí)例詳解

    java 讀取網(wǎng)頁(yè)內(nèi)容的實(shí)例詳解

    這篇文章主要介紹了java 讀取網(wǎng)頁(yè)內(nèi)容的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • SpringCloud Gateway跨域配置代碼實(shí)例

    SpringCloud Gateway跨域配置代碼實(shí)例

    這篇文章主要介紹了SpringCloud Gateway跨域配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • springMVC返回Http響應(yīng)的實(shí)現(xiàn)

    springMVC返回Http響應(yīng)的實(shí)現(xiàn)

    本文主要介紹了在Spring Boot中使用@Controller、@ResponseBody和@RestController注解進(jìn)行HTTP響應(yīng)返回的方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • springBoot @Enable* 注解的使用

    springBoot @Enable* 注解的使用

    這篇文章主要介紹了springBoot @Enable* 注解的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • SpringBoot指定激活配置文件的方法

    SpringBoot指定激活配置文件的方法

    Spring Boot 對(duì)多環(huán)境整合已經(jīng)有了很好的支持,能夠在運(yùn)行間、打包時(shí)自由切換環(huán)境,這篇文章主要介紹了SpringBoot指定激活配置文件,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

尼玛县| 诸城市| 巴东县| 永济市| 沧州市| 昌江| 正镶白旗| 仲巴县| 文昌市| 漠河县| 天等县| 循化| 米脂县| 深州市| 襄城县| 三门峡市| 乐都县| 社会| 隆德县| 莎车县| 工布江达县| 炎陵县| 甘肃省| 沙坪坝区| 六安市| 峨山| 天祝| 渭南市| 平陆县| 万宁市| 社会| 武汉市| 东乡族自治县| 于都县| 杭锦后旗| 鄂尔多斯市| 孙吴县| 达孜县| 登封市| 贵德县| 香港 |