這篇文章主要介紹了Java透過匿名類別來實現回呼函數的例子,回呼函數就是一種函數簽章(若干個輸入參數、一個輸出參數)的規範,java雖然不存在函數聲明,但是java可以用接口來強制規範。具體操作步驟大家可查看下文的詳細講解,有興趣的朋友可以參考一下。
在C語言中,函數名稱可以當做函數指標傳遞給形參從而實現回呼
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表達式的方式
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可以用介面來強制規範。
interface Funcable { void Func(); }
這樣只要實作了該介面的類,都有一個函數簽名和void Func()一致的成員函數(嘛,還是不習慣方法(method)這種叫法),於是只需要把實作了該介面的類別的物件傳入函數中,然後在函數中呼叫該物件的Func()方法即可
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表達式
do_func(new Funcable() { @Override public void Func() { System.out.println("f2()"); } });
說到lambda表達式,它是可以捕獲外部變數的,在Java這種方式也可以透過匿名內的匿名建構函數來明確地捕捉外部的變數
String msg = "f3()"; do_func(new Funcable() { String _msg; { _msg = msg; } @Override public void Func() { System.out.println(_msg); } });
這種做法就很像lambda表達式了,因為匿名類別的匿名建構函數是只能以外部變數為建構參數的,相當於lambda表達式的“捕獲”,對應C++的lambda表達式寫法就是
std::string msg = "f3()"; do_func([&msg]() { std::cout << msg << std::endl; });
java8也有lambda表達式了,因此可以寫成這樣
do_func(() -> { System.out.println(msg); });
以上是Java使用匿名類別實作回呼函數的範例講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具