150天打卡day17_詳解接口的使用
why
在Java中,可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類(lèi)。這兩者有太多相似的地
方,又有太多不同的地方。
?
案例
飛機(jī)和鳥(niǎo)是不同類(lèi)的事物,但是它們都有一個(gè)共性,就是都會(huì)飛。那么在設(shè)計(jì)的時(shí)候,可以將
飛機(jī)設(shè)計(jì)為一個(gè)類(lèi)Airplane,將鳥(niǎo)設(shè)計(jì)為一個(gè)類(lèi)Bird,但是不能將 飛行 這個(gè)特性也設(shè)計(jì)為類(lèi),
因此它只是一個(gè)行為特性,并不是對(duì)一類(lèi)事物的抽象描述。
類(lèi)描述對(duì)象的屬性和方法。接口則包含類(lèi)必須要實(shí)現(xiàn)的方法,是對(duì)行為的抽象所以通常我們說(shuō)
接口是一種約束。
接口,英文稱(chēng)作interface,在軟件工程中,接口泛指供別人調(diào)用的方法或者函數(shù)。
接口的定義
接口(Interface)接口可以看成是特殊的抽象類(lèi),只包含抽象方法的抽象類(lèi)。接口并不是類(lèi),
編寫(xiě)接口的方式和類(lèi)很相似,但是屬于不同的概念,類(lèi)描述對(duì)象的屬性和行為,接口則包含類(lèi)
要實(shí)現(xiàn)的方法。
接口的特性
接口中的每一個(gè)方法都會(huì)被隱式的指定為公開(kāi)的抽象方法
接口中不能放實(shí)例變量,只能放置靜態(tài)常量
接口中的方法不能在接口中實(shí)現(xiàn),只能在類(lèi)中實(shí)現(xiàn)
案例貫穿
本例要求實(shí)現(xiàn)銀行卡系統(tǒng)的銀聯(lián)接口,詳細(xì)要求如下:
銀聯(lián)接口,用于描述銀聯(lián)統(tǒng)一制定的規(guī)則,該接口提供檢測(cè)密碼方法、取錢(qián)方法以及查詢(xún)余額方法。
工商銀行接口,用于描述工商銀行發(fā)行的卡片功能,在滿(mǎn)足銀聯(lián)接口的規(guī)則基礎(chǔ)上,增加了在線支付功能。
農(nóng)業(yè)銀行接口,用于描述中國(guó)農(nóng)業(yè)銀行發(fā)行的卡片功能,在滿(mǎn)足銀聯(lián)接口的規(guī)則基礎(chǔ)上,增加了支付電話(huà)費(fèi)的功能。另外,農(nóng)行的卡的卡內(nèi)余額,允許最多透支2000。
實(shí)現(xiàn)工商銀行接口和農(nóng)業(yè)銀行接口,并進(jìn)行測(cè)試。
一、定義一個(gè)接口
接口通過(guò)interface關(guān)鍵字來(lái)定義接口
修飾符 interface 接口名稱(chēng)
案列:
步驟一:定義銀聯(lián)接口
定義名為Unionpay的銀聯(lián)接口,用于描述銀聯(lián)統(tǒng)一制定的規(guī)則:然后在該接口中定義
getBalance方法來(lái)獲取余額功能,定義getgetMoney表示取錢(qián)功能,定義checkPwd來(lái)檢查密
碼功能
接口總結(jié):
接口是隱式抽象的,當(dāng)聲明一個(gè)接口的時(shí)候,不用使用abstract關(guān)鍵字
接口中不可以定義成員變量,但可以定義常量
接口中只可以定義抽象方法,但是可以省略abstract
接口中的方法都是公有的
二、接口的繼承
一個(gè)接口能繼承另一個(gè)接口,和類(lèi)之間的繼承方法比較相似,接口的繼承使用extends關(guān)鍵
字,子接口父接口中的方法
案列
步驟二:定義工商銀行接口
定義名為ICBC的工商銀行接口,用于描述中國(guó)工商銀行發(fā)行的卡片功能,該接口實(shí)現(xiàn)需要滿(mǎn)
足銀聯(lián)接口的功能,因此繼承銀聯(lián)接口,而且該接口在具備銀聯(lián)接口的功能基礎(chǔ)上,要求增加
在線支付功能,所以在接口中定義payOnLine方法
步驟三:定義農(nóng)商銀行接口
定義名為ABC的農(nóng)商銀行接口,用于描述農(nóng)商銀行發(fā)行的卡片功能,該接口實(shí)現(xiàn)需要滿(mǎn)足銀聯(lián)
接口的功能,因此也繼承銀聯(lián)接口,而且在具備銀聯(lián)接口的功能基礎(chǔ)上,要求增加支付電話(huà)費(fèi)
功能,所以在接口中定義PayTelTelBill方法
接口的繼承總結(jié)
接口間存在繼承關(guān)系
一個(gè)接口可以通過(guò)extends關(guān)鍵字來(lái)繼承另一個(gè)接口,子接口繼承了父接口中定義的所有方法。
接口可以多繼承
三、實(shí)現(xiàn)接口
接口是抽象的,沒(méi)有具體的實(shí)現(xiàn),需要由類(lèi)來(lái)實(shí)現(xiàn),接口的實(shí)現(xiàn)用implements關(guān)鍵字來(lái)實(shí)現(xiàn)
放在class關(guān)鍵字的后面,一個(gè)類(lèi)實(shí)現(xiàn)了某接口后,必須實(shí)現(xiàn)接口中的抽象方法,否則這個(gè)類(lèi)
必須聲明為抽象類(lèi)。
語(yǔ)法:
class 類(lèi)名 implements 接口名,接口名{}
案列:
步驟四:實(shí)現(xiàn)工商銀行接口
定義名為ICBCImpl的類(lèi),該類(lèi)實(shí)現(xiàn)ICBC接口:另外,分析問(wèn)題中的取錢(qián)功能,需要對(duì)余額信息進(jìn)行存儲(chǔ),插入卡片以后需要輸入密碼后才能進(jìn)行取錢(qián),因此,在ICBCImpl類(lèi)中定義double類(lèi)型屬性money表示賬戶(hù)余額以及String類(lèi)型屬性pwd表示卡片的密碼
??
步驟五:實(shí)現(xiàn)農(nóng)商銀行接口
實(shí)現(xiàn)農(nóng)業(yè)銀行接口的過(guò)程和實(shí)現(xiàn)工行接口的過(guò)程類(lèi)似,實(shí)現(xiàn)的過(guò)程中注意,農(nóng)行卡內(nèi)余額可以透支2000.
步驟六:測(cè)試
接口的實(shí)現(xiàn)總結(jié)
類(lèi)在重寫(xiě)方法時(shí)要保持一致的方法名,和參數(shù)類(lèi)型以及返回值
如果實(shí)現(xiàn)接口的類(lèi)是抽象類(lèi),那么就沒(méi)必要實(shí)現(xiàn)該接口的方法
一個(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口
一個(gè)類(lèi)只能繼承一個(gè)類(lèi),但是能實(shí)現(xiàn)多個(gè)接口
接口不能實(shí)例化
四、接口和類(lèi)的區(qū)別
相同點(diǎn)
接口和類(lèi)都可以有多個(gè)方法
接口和類(lèi)文件都保存在.java的文件中,字節(jié)碼文件都是.class文件
不同點(diǎn)
接口不能實(shí)例化對(duì)象
接口沒(méi)有構(gòu)造方法
接口中的所有的方法都必須是抽象方法
接口中不能放置實(shí)例變量,但是可以放置靜態(tài)常量
接口可以繼承接口,但是需要被類(lèi)實(shí)現(xiàn)
接口支持多繼承
五、抽象類(lèi)和接口的區(qū)別
抽象類(lèi)中可以有方法體,接口中不行
抽象類(lèi)中的成員變量可以是各種類(lèi)型,但是接口中不行,只能是靜態(tài)常量
抽象類(lèi)中可以有靜態(tài)代碼塊和靜態(tài)方法,但是接口不能有靜態(tài)代碼塊和靜態(tài)方法
一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi),但是一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口
?
接口代碼應(yīng)用案例
歡迎??點(diǎn)贊+關(guān)注,筆芯??
