Java中介面(Interface)的定義和使用
有關 Java 中介面的使用相信程式設計師們都知道,但是你們知不知道介面到底有什麼用呢?毫無疑問,介面的重要性遠比想象中重要。接下來我們便一起來學習Java中介面使用。
Java介面是什麼
Java介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
介面(英語:Interface),在JAVA程式語言中是一個抽象型別(Abstract Type),它被用來要求類(Class)必須實現指定的方法,使不同類的物件可以利用相同的介面進行溝通。介面通常以interface來宣告,它僅能包含方法簽名(Method Signature)以及常數宣告(變數宣告包含了 static 及 final)
介面無法被例項化,但是可以被實現。一個實現介面的類,必須實現介面內所描述的所有方法,否則就必須宣告為抽象類(Abstract Class)。另外,在Java中,介面型別可用來宣告一個變數,他們可以成為一個空指標,或是被繫結在一個以此介面實現的物件。
其中一個使用介面的優勢是,可以利用他們模擬多重繼承,類在JAVA中不允許多重繼承,所有在JAVA中的類必須而且僅能有一個父類,而java.lang.Object(JAVA型別系統中最頂層的型別)是唯一一個例外。
JAVA的類可以被實現許多個介面,然而一個介面則無法實現其他的介面。
Java介面能實現什麼功能呢
在Java語言規範中,一個方法的特徵僅包括方法的名字,引數的數目和種類,而不包括方法的返回型別,引數的名字以及所丟擲來的異常。在Java編譯器檢查方法的過載時,會根據這些條件判斷兩個方法是否是過載方法。但在Java編譯器檢查方法的置換時,則會進一步檢查兩個方法(分超型別和子型別)的返還型別和丟擲的異常是否相同。
Java介面本身沒有任何實現,因為Java介面不涉及表象,而只描述public行為,所以Java介面比Java抽象類更抽象化。但是介面不是類,不能使用new 運算子例項化一個介面。
如:
x=new comparable(……);//這個是錯誤來的。
但是可以宣告介面變數
Comparable x; //這是允許的。
Java介面的方法只能是抽象的和公開的,Java介面不能有構造器,Java介面可以有public、靜態的和final屬性。即介面中的屬性可以定義為
public static final int value=5;
介面把方法的特徵和方法的實現分割開來。這種分割體現在介面常常代表一個角色,它包裝與該角色相關的操作和屬性,而實現這個介面的類便是扮演這個角色的演員。一個角色由不同的演員來演,而不同的演員之間除了扮演一個共同的角色之外,並不要求其它的共同之處。
介面的定義方式如下
介面的主體包含著抽象方法,但所有方法在介面內(定義上)都是抽象(Abstract)方法,所以abstract的關鍵字在介面內則不被需要。由於介面代表著一個對外行為的集合,所以任何方法在介面內都是public(公開的)。
public interface Predator {
boolean chasePrey(Prey p);
void eatPrey(Prey p);
}
介面內的成員皆為靜態(static)、final及公開(public),反之,他們可以成為任何類或介面的型別
介面的使用解決類只能單繼承的問題,因為一個類可以實現多個介面。
那麼Java中要如何去實現一個介面並且在實現他的子類中呼叫介面中的方法呢?介面的實現方式
public class Lion implements Predator {
public boolean chasePrey(Prey p) {
// programming to chase prey p (specifically for a lion)
}
public void eatPrey (Prey p) {
// programming to eat prey p (specifically for a lion)
}
}
如果一個類實現了一個介面,而沒有實現介面的所有方法,則它必須被標註為abstract(抽象類)。一個抽象類的子類必須實現它未完成的方法,假如該項子類仍不會實現介面的所有方法,那麼該項子類依然需要被標註為abstract。
介面通常被使用在Java程式語言,用來做回撥函式使用 。Java並不允許方法作為引數傳遞使用,因此,其中一個解決辦法則是可以定義一個介面,把這個介面當成方法的引數,以此來使用該項物件的方法簽名。
子介面[編輯]
介面可以被延伸為數個不同的介面,可以使用上述所描述的方法,舉例來說:
public interface VenomousPredator extends Predator, Venomous {
//介面主體
}
以上的程式片段是合法定義的子介面,與類不同的是,介面允許多重繼承,而Predator 及 Venomous 可能定義或是繼承相同的方法,比如說kill(Prey prey),當一個類實現VenomousPredator的時候,它將同時實現這兩種方法。
有些泛用的Java介面可供參考:
Comparable
擁有一個方法compareTo,用以描述兩個物件是否相等,或是其中一個物件大於另外一個物件。泛型允許已經實現的類,其物件可以用來互相比較。
Serializable 是一個marker interface 沒有任何介面或是欄位,僅有一個空的主體,它被用來表示一個類可以被序列化。它的Javadoc描述了他是如何運作,而且不需要被強制程式設計。