Java筆記丨15 介面
介面,某種特徵的約定
定義介面interface
所有的方法都自動是public abstract
實現介面implements
可以實現多繼承
與類的繼承關係無關
面向介面程式設計,而不是面向實現
Flyable f = new bird();
Java中有大量的介面
介面的作用
1.通過介面可以實現不相關類的相同行為,而不需要考慮這些類之間的層次關係。從而在一定意義上實現了多重繼承
2.通過介面可以指明多個類需要實現的方法
3.通過介面可以瞭解物件的互動介面,而不需瞭解物件所對應的類
示例:
interface Collection{ void add(Object obj); void delete(Object obj); Object find(Object obj); int size(); }
通常介面以able或ible結尾,表明介面可以完成一定的行為。
介面宣告中還可以包括對介面的訪問許可權以及它的父介面列表。完整的介面宣告如下:
[public]interface interfaceName[extends listOfSuperInterface]{
……
}
其中public指明任意類均可以使用這個介面,預設的情況下,只有與該介面位於同一個包中的類才可以訪問這個介面
extends子句與類宣告中的extends子句基本相同,不同的是一個介面可以有多個父介面,用逗號隔開,而一個類只能有一個父類。子介面繼承父介面中所有的常量和方法。
方法的定義格式為:
returnType methodName([paramlist]);
介面中只進行方法的宣告,而不提供方法的實現,所以,方法定義沒有方法體,且用分號結尾。在介面中宣告的方法具有public和abstract屬性。所有在定義時,這兩個關鍵詞可以省略。
另外,如果在子介面中定義了和父類介面同名的常量或相同的方法,則父介面中的常量被隱藏,方法被過載。
介面的實現
在類的宣告中用implements子句來表示一個類使用某個介面,在類體重可以使用介面中定義的常量,而且必須實現介面中定義的所有方法。一個類可以實現多個介面。
下面在類FIFOQueue類中實現上面定義的介面collection:
class FIFOQueue implements collection{
public void add(Object obj){
……
}
public void delete(Object obj){
……
}
public Object find(Object obj){
……
}
public int currentCount{
……
}
在類中實現介面所定義的方法時,方法的宣告必須與介面中所定義的完全一致。
介面型別
介面可以作為一種引用型別來使用。任何實現該介面的類的例項都可以儲存在該介面型別的變數中,通過這些變數可以訪問類所實現的介面中的方法。Java執行時系統動態地確定該使用哪個類中的方法。
把介面作為一種資料型別可以不需要了解物件所對應的具體的類,以前面所定義的介面Collection和實現該類FIFOQueue為例,下例中,我們以Collection作為引用型別來使用。
class InterfaceType{
public static void main(String args[]){
Collection c=new FIFOQueue();
……
c.add(obj);
……
}
}
介面中的常量
介面體中可以包含常量定義
常量定義的格式為:
type NAME=value;
其中type可以是任意型別,NAME是常量名,通常大寫,value是常量值。
在介面中定義的常量可以被實現該介面的多個類共享,它與C中用#define已經C++中用const定義的常量是相同的。
在介面中定義的常量具有public,static,final屬性,定義時可省略。
列舉
從JDK1.5起,可以使用列舉
enum Light{Red,Yellow,Green}
使用
Light light=Light.Red;
switch(light){case Red:……break;}
注意:case後面不能寫成Light.Red
Java中的列舉是用class來實現的,可以複雜地使用
Java8中的介面
Java8以上,介面成員還可以是:
static方法
具有實現體的方法(default方法)
預設方法的好處是:提供了一個預設實現,子類在implements可以不用再重新寫