一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 再談java回調函數

再談java回調函數

2019-12-30 13:45hebedich 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中,回調方法是用借用接口來實現的,我在網上找到一句話:

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

?
1
2
3
interface CallBackInterface {
  void callBackMethod();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
interface CallBackInterface {
  void callBackMethod();
}
 
class CallBackClass implements CallBackInterface{
 
  @Override
  public void callBackMethod() {
    System.out.println("hello");
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
  }
}

現在可以調用試試看了:

?
1
2
3
4
5
public class Test {
  public static void main(String[] args) {
    new CallBackTest().showCallBack();
  }
}

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

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

再多說一點,這里任何實現了CallbackInterface接口的類,都可以像下面這樣放在new后面(就是賦值):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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的時候遇到的。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月婷婷在线观看 | 日本精品久久久久久久久免费 | 亚洲成综合 | 欧美日韩看看2015永久免费 | 国产梦呦精品 | 我将她侵犯1~6樱花动漫在线看 | 校园刺激全黄H全肉细节文 校草让我脱了内裤给全班看 | 欧美黑人一级片 | 国产成人在线播放视频 | 日本中文字幕一区二区有码在线 | 国产免费一区二区三区 | 国产性片在线观看 | 香蕉国产人午夜视频在线 | 奇米888在线看奇米999 | 日韩欧美一区二区三区中文精品 | 波多野结衣教师未删减版 | 免费观看在线 | 嫩草影院永久一二三入口 | 国产在线观看人成激情视频 | 亚洲欧美日韩在线观看看另类 | 日产乱码2021永久手机版 | 关晓彤被草| 国产日本免费 | 全彩调教侵犯h本子全彩妖气he | 成人au免费视频影院 | 236宅宅2021最新理论 | 亚洲国产在线观看免费视频 | 日本一区二区免费在线观看 | 加勒比一本大道香蕉在线视频 | 国产麻豆成91 | 国产51社区精品视频资源 | 亚洲 欧美 国产 在线 日韩 | chinesegay黑袜玩奴| 香港三级系列在线播放 | 91天堂视频 | 日韩国产成人精品视频人 | 成人亚洲欧美日韩中文字幕 | 精品亚洲欧美中文字幕在线看 | 欧洲肥女大肥臀 | 青柠影院在线观看免费完整版1 | 俄罗斯13一14处出血视频在线 |