抽象類是從多個(gè)類中抽取出來的模版,如果將這種抽象進(jìn)行的更加徹底,則可以提煉出一中更加特殊的抽象類——接口(interface),接口里不能包含普通方法,接口里的所有方法都是抽象方法。
接口的定義
接口使用interface關(guān)鍵字,基礎(chǔ)語法如:
[修飾符] interface 接口名 extends 父接口1,父接口2...
{
零到多個(gè)常量定義...
零到多個(gè)抽象方法定義...
}
接口里可以包含變量(只能是常量)、方法(只能是抽象實(shí)例方法)、內(nèi)部類(包括內(nèi)部接口和枚舉)定義。而且都是public訪問權(quán)限。
對(duì)于接口里定義的常量而言,它們是接口相關(guān)的,而且只能是常量,因此系統(tǒng)會(huì)自動(dòng)增加static和final 修飾符,接口里定義的變量只能在定義時(shí)指定初始化值。
接口里定義變量,以下兩句話的代碼結(jié)果完全一樣:
int MAX_SIZE=10;
public static final int MAX_SIZE=10;
對(duì)于接口中定義的方法而言,全部是抽象方法,不管定義接口方法時(shí)是否使用了public abstract修飾,總是默認(rèn)使用public abstract修飾。而也因此接口不允許定義靜態(tài)方法,即不可以使用static修飾。
public interface Output{
int MAX_SIZE=10;
void out();
void getData(String msg);
}
接口的繼承
接口支持多繼承,即一個(gè)接口可以有多個(gè)直接父接口,和類繼承相似,子接口擴(kuò)展多個(gè)父接口,將會(huì)獲得父接口里邊定義的所以抽象方法、常量、內(nèi)部類和枚舉類定義。
格式為:多個(gè)父接口排在extends關(guān)鍵字之后,多個(gè)父接口之間使用英文逗號(hào)隔開。

接口的使用
接口不能用于創(chuàng)建實(shí)例,但接口可以用于聲明引用類型變量,當(dāng)使用接口來聲明引用類型變量時(shí),這個(gè)引用類型變量必須引用到其實(shí)現(xiàn)類的對(duì)象。除此之外,接口的主要用途是被實(shí)現(xiàn)類實(shí)現(xiàn)。
一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口,使用implements關(guān)鍵字。因?yàn)橐粋€(gè)類可以實(shí)現(xiàn)多個(gè)接口,這也是java為單繼承靈活性不足所做的補(bǔ)充。類實(shí)現(xiàn)接口的語法如下:
[修飾符] class 類名 extends 父類 implements 接口1,接口2...{
類體部分
}
一個(gè)類可以繼承一個(gè)父類,但是可以實(shí)現(xiàn)多個(gè)接口,多個(gè)接口之間使用英文逗號(hào)隔開。implements部分必須放在extends部分之后。
一個(gè)類實(shí)現(xiàn)一個(gè)或多個(gè)接口后,必須實(shí)現(xiàn)該接口全部抽象方法,也就是重寫全部抽象方法。否則,該類將保留從父接口那繼承到的抽象方法,該類也必須定義為抽象類。
實(shí)現(xiàn)接口方法時(shí),必須使用public修飾符,因?yàn)榻涌诶锏姆椒ǘ际莗ublic,而子類重寫父類方法時(shí)訪問權(quán)限只能是更多或者相等,所以實(shí)現(xiàn)類實(shí)現(xiàn)接口里的方法時(shí)只能使用public訪問權(quán)限。
接口和抽象類
接口和抽象類的相同點(diǎn):
(1)接口和抽象類都不能實(shí)例化。
(2)接口和抽象類都可以包含抽象方法,實(shí)現(xiàn)接口或繼承抽象類的普通子類都必須實(shí)現(xiàn)這些抽象方法。
不同點(diǎn):
(1)接口里只能包含抽象方法,抽象類可以包含普通方法。
(2)接口里不能定義靜態(tài)方法,抽象類可以。
(3)接口里只能定義靜態(tài)常量,不能定義普通常量、變量。抽象類都可以。
(4)接口里不包括構(gòu)造器,抽象類可以包含,并不是用于創(chuàng)建對(duì)象,而是讓其子類調(diào)用這些構(gòu)造器來完成抽象類的初始化操作。
(5)接口里不能包含初始化塊,而抽象類可以包含。
(6)一個(gè)類最多只能有一個(gè)直接父類,但一個(gè)類可以直接實(shí)現(xiàn)多個(gè)接口。