接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類實現(xiàn)的接口的方法。實際上,當(dāng)接口變量調(diào)用被類實現(xiàn)的接口中的方法時,就是通知相應(yīng)的對象調(diào)用接口的方法,這一過程稱為對象功能的接口回調(diào)。
Java接口回調(diào)一般用法:實現(xiàn)接口實際上和繼承抽象類類似,只不過繼承是在類的層面上操作,接口是在方法和常量集合的層面上操作,接口比抽象類更抽象、更簡潔。可以把實現(xiàn)接口看成繼承特定的一個或多個方法以及一些常量,關(guān)于接口的具體規(guī)則這里不贅述。
為什么要使用接口和抽象類?因為從很多角度講,這樣做符合面向?qū)ο蟮脑O(shè)計思想,比如開閉原則等。
從實際開發(fā)的角度講,Java不支持多繼承,為了彌補這一點,接口的存在就極為重要,和繼承不同,一個類可以實現(xiàn)多個接口。
接口的一大作用是實現(xiàn)回調(diào),回調(diào)分同步回調(diào)和異步回調(diào),區(qū)別是異步回調(diào)使用了多線程技術(shù),當(dāng)回調(diào)中有耗時操作時,就需要使用異步回調(diào)。
以下全部以異步回調(diào)為例。以下以java寫法為例,android同理。
1、一般用法
新建入口類 Main,并新建接口 InterfaceExample
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Main implements InterfaceExample{ public static void main(String[] args) { System.out.println( "------接口使用測試--------" ); InterfaceTest test = new InterfaceTest(); //調(diào)用InterfaceTest的handleThings方法,并傳遞Main的實例 test.handleThings( new Main()); System.out.println( "------異步回調(diào)測試--------" ); } @Override //重寫接口方法 public void sendMessage(String string) { System.out.println( "接口回調(diào)成功,利用 " + string + " 做一些事" ); } } //接口也可以寫在一個獨立的.java文件里 interface InterfaceExample { void sendMessage(String string); } |
下面新建發(fā)起回調(diào)的類InterfaceTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class InterfaceTest { //注意這里Main實例向上轉(zhuǎn)型,接口變量引用了Main實例 public void handleThings(InterfaceExample example) { new Thread( new Runnable() { @Override public void run() { System.out.println( "-----做一些事------" ); try { Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } //回調(diào)接口方法 example.sendMessage( "接口傳的參數(shù)" ); } }).start(); } } |
最后運行輸出:
1
2
3
4
|
------接口使用測試-------- ------異步回調(diào)測試-------- -----做一些事------ 接口回調(diào)成功,利用 接口傳的參數(shù) 做一些事 |
其中異步的處理也可以在Main中調(diào)用handleThings時進(jìn)行。
2、結(jié)合匿名內(nèi)部類實現(xiàn)接口回調(diào)
第二種方法只需要在第一種的基礎(chǔ)上修改Main類就可以
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Main { public static void main(String[] args) { System.out.println( "------接口使用測試--------" ); InterfaceTest test = new InterfaceTest(); //調(diào)用InterfaceTest的handleThings方法,并使用實現(xiàn)了InterfaceExample接口的匿名內(nèi)部類 //在該匿名內(nèi)部類中重寫接口方法 test.handleThings( new InterfaceExample() { @Override //重寫接口方法 public void sendMessage(String string) { System.out.println( "接口回調(diào)成功,利用 " + string + " 做一些事" ); } }); System.out.println( "------異步回調(diào)測試--------" ); } } interface InterfaceExample { void sendMessage(String string); } |
可以看到,采用匿名內(nèi)部類的方式可以簡化代碼,使程序結(jié)構(gòu)更清晰。所以這種用法很常見,比如android系統(tǒng)提供的view的點擊事件就是采用這種形式進(jìn)行回調(diào)。
輸出是一樣的:
1
2
3
4
|
------接口使用測試-------- ------異步回調(diào)測試-------- -----做一些事------ 接口回調(diào)成功,利用 接口傳的參數(shù) 做一些事。 |
本文關(guān)于Java編程接口回調(diào)一般用法的介紹就到這里,希望對大家有所幫助。
原文鏈接:https://www.2cto.com/kf/201704/620057.html