在學(xué)習(xí)Android事件機(jī)制之前,有必要把相關(guān)的Java知識先進(jìn)行一下回顧。與Android事件相關(guān)的Java知識主要包括:接口、內(nèi)部類,下面講解這些知識點(diǎn)。
1、接口
Java下接口主要描述類應(yīng)該具備什么功能。接口是一種契約機(jī)制,描述了相關(guān)的類應(yīng)遵循一定的、統(tǒng)一的格式定義。在Java中,接口通過關(guān)鍵字Interface定義。例如下面的接口定義:
package?com.zhangw.crazyandroid;public?interface?UserDao?{????String?findUserName(String?id);}
該接口描述了這樣一種契約,實(shí)現(xiàn)該接口的類必須提供findUserName方法,該方法必須要有一個String類型的參數(shù)。
為了讓類實(shí)現(xiàn)某個接口,只需要一下兩步:
通過Implements聲明某個類實(shí)現(xiàn)特定的接口;
對接口的中所有方法進(jìn)行定義;
下面給出UserDao接口的實(shí)現(xiàn),如下所示:
package?com.zhangw.crazyandroid;public?class?UserTableDao?implements?UserDao?{????public?String?findUserName(String?id)?{????????return?"zhangw";????}}
這里需要注意的是,在接口中,不用把方法申明為public,因?yàn)榻涌谥械姆椒ǘ际莗ublic。但是在實(shí)現(xiàn)接口時,必須在實(shí)現(xiàn)類里面將對應(yīng)的方法申明為public,否則方法默認(rèn)為包可見。
關(guān)于接口還有幾點(diǎn)要說明:
接口不是類,不能用new實(shí)例化;
可以申明接口的變量,但是接口的變量必須復(fù)制具體實(shí)現(xiàn)類的對象;
可以使用instance檢查一個類是否實(shí)現(xiàn)了特定的接口,如下所示:
if(userDao?instanceof?UserDao){???Log.d("接口測試",?"是UserDao接口");}
類似于類的繼承關(guān)系,接口也可以進(jìn)行繼承擴(kuò)展;
一個類可以實(shí)現(xiàn)多個接口,實(shí)現(xiàn)的多個接口之間用,分割
接口中可以定義常量
在Java SE 8中,接口可以定義靜態(tài)方法,但這樣的設(shè)計(jì)有悖于接口抽象機(jī)制的初衷,不推薦。
接口可以通過關(guān)鍵字default聲明默認(rèn)方法,提供默認(rèn)實(shí)現(xiàn),這樣實(shí)現(xiàn)接口的開發(fā)人員可以只覆蓋需要的方法,例如下面代碼所示:
package?com.salary.myjava;public?interface?UserDao?{????String?queryNameById(String?id);????default?String?queryOrgById(String?id){return?id;};}
2、內(nèi)部類
內(nèi)部類是定義在一個類里面的類,內(nèi)部類有以下特點(diǎn):
內(nèi)部類方法可以訪問外部類的數(shù)據(jù)
內(nèi)部類可以對同一個包中的其他類隱藏起來;
通常使用匿名內(nèi)部類實(shí)現(xiàn)回調(diào)機(jī)制
下面給出一個內(nèi)部類的樣例
package?com.salary.myjava;public?class?MyWindow?{????private?String?title?=?"111";????private?String?name?=?"222";????//?內(nèi)部接口????public?interface?StartListener{????????String?getWindowTitle();????}????//?內(nèi)部類????public?class?UserDaoImp?implements?UserDao{????????public?String?queryNameById(String?id){????????????return?MyWindow.this.title;????????}????}????public?void?load(){????????UserDao?userDao?=?new?UserDaoImp();????????System.out.println(userDao.queryNameById("111"));????}????public?void?load2(){????????//??匿名類????????StartListener?startListener?=?new?StartListener(){????????????public?String?getWindowTitle(){????????????????return?MyWindow.this.title;????????????}????????};????????System.out.print(startListener.getWindowTitle());????}}
這里我們定義了UserDaoImp類,該類是MyWindow的內(nèi)部類,此外我們還在MyWinow類的內(nèi)部定了一個接口StartListener,并在load2方法中,通過一個匿名類實(shí)現(xiàn)了該接口。
這里需要說明的是:
內(nèi)部類主要用于方法的回調(diào)處理;
在內(nèi)部類可以通過<外部類的名稱.this>訪問外部類的this指針。
在類的內(nèi)部也可以定義接口,如上所StartListener
以上就是長沙達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對“編程基礎(chǔ)之Java的接口與內(nèi)部類視頻”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。