1. 程式人生 > >Java筆記丨15 介面

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可以不用再重新寫