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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java通過匿名類來實現回調函數實例總結

Java通過匿名類來實現回調函數實例總結

2020-12-19 14:30sss Java教程

這篇文章主要介紹了Java通過匿名類來實現回調函數的例子,回調函數就是一種函數簽名(若干個輸入參數、一個輸出參數)的規范,java雖不存在函數聲明,但是java可以用接口來強制規范。具體操作步驟大家可查看下文的詳細講解

在C語言中,函數名可以當做函數指針傳遞給形參從而實現回調

?
1
2
3
4
5
6
7
8
9
10
void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}

在C++11中,實現回調還可以通過函數模板和lambda表達式的方式

?
1
2
3
4
5
6
7
8
template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}

而假如回調函數的代碼實現較為復雜,且具有重用價值,lambda表達式這種一次性的方案就不太適合,在C++11之前,是通過函數對象來實現的。函數對象說白了就是一個類的普通對象,只不過C++可以重載括號運算符,導致調用類的對象的operator()方法時,就像調用函數一樣自然。

而分析本質,其實回調函數就是一種函數簽名(若干個輸入參數、一個輸出參數)的規范,java雖不存在函數聲明,但是java可以用接口來強制規范。

?
1
2
3
interface Funcable {
  void Func();
}

這樣只要實現了該接口的類,都有一個函數簽名和void Func()一致的成員函數(嘛,還是不習慣方法(method)這種叫法),于是只需要把實現了該接口的類的對象傳入函數中,然后在函數中調用該對象的Func()方法即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class F1 implements Funcable {
 
  @Override
  public void Func() {
    System.out.println("f1()");
  }
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  }
  public static void main(String[] args) {
    do_func(new F1());
  }
}

這里節省代碼量,就不把類F2、F3給寫出來了。并且利用java的匿名類可以節省代碼,類似于lambda表達式

?
1
2
3
4
5
6
do_func(new Funcable() {     
    @Override
    public void Func() {
      System.out.println("f2()");
    }
  });

說到lambda表達式,它是可以捕獲外部變量的,在Java這種方式還可以通過匿名內的匿名構造函數來顯式捕獲外部的變量

?
1
2
3
4
5
6
7
8
9
10
11
String msg = "f3()";
  do_func(new Funcable() {
    String _msg;
    {
      _msg = msg;
    }
    @Override
    public void Func() {
      System.out.println(_msg);
    }
  });

這種做法就很像lambda表達式了,因為匿名類的匿名構造函數是只能以外部變量為構造參數的,相當于lambda表達式的“捕獲”,對應C++的lambda表達式寫法就是

?
1
2
std::string msg = "f3()";
 do_func([&msg]() { std::cout << msg << std::endl; });

java8也有lambda表達式了,因此可以寫成這樣

do_func(() -> { System.out.println(msg); });

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助~如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持!

原文鏈接:http://www.mamicode.com/info-detail-1967633.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本人黄色 | 美女扒开腿让男人桶爽动态图片 | poronovideos变态极限| 97精品久久天干天天蜜 | 湿好紧太硬了我太爽了 | 国产精品天天看天天爽 | 特黄特黄一级片 | 青青青手机在线视频 | 亚洲 日本 中文字幕 制服 | 亚洲精品第一国产综合 | 亚洲AV无码A片在线观看蜜桃 | 亚洲狼人综合干 | 视频大全在线观看免费 | 日韩中文在线 | 日本老妇和子乱视频 | 久久成人a毛片免费观看网站 | 亚洲AV久久无码精品九号软件 | 国产精品亚洲片夜色在线 | 男人女人日皮视频 | 免费特黄一级欧美大片在线看 | 国产欧美一区二区三区免费 | 大学生宿舍飞机china free | 成人影院在线观看视频 | 日本高清中文字幕视频在线 | 亚洲精品一二三四区 | 亚洲国产区 | 日本中文字幕黑人借宿影片 | 日本一道本中文字幕 | 午夜影院和视费x看 | 精品国产一区二区三区在线观看 | 精品精品久久宅男的天堂 | 免费网址视频在线看 | 国产精品久久亚洲一区二区 | 国产一区二区在线观看美女 | 免费全看男女拍拍拍的视频 | 青青青视频蜜桃一区二区 | h肉动漫在线视频无修无遮挡 | 福利视频免费 | 色先锋影音先锋 | 国产精品视频2020 | 性xxxx欧美高清 |