Java接口
接口是抽象方法的集合。一個類實現一個接口,從而繼承接口的抽象方法。
接口不是一個類。寫一個界麵類似寫一個類,但它們是兩個不同的概念。類描述對象的屬性和行為。接口包含一個類實現的行為。
除非實現接口的類是抽象,接口中的所有方法必須在類中定義。
接口是一個類似的類中的方法如下:
-
接口可以包含任何數量的方法。
-
接口被寫在同一個 .java 擴展名的文件,並提供相應的文件的名稱的接口的名稱。
-
接口的字節碼會出現在一個 .class文件。
-
接口出現在包中,及其相應的字節碼文件必須相匹配的包名的目錄結構。
然而,一個接口是一類在幾個方麵有所不同,其中包括:
-
不能實例化一個接口。
-
接口不包含任何構造函數.
-
所有在接口中的方法都是抽象的.
-
接口不能包含實例字段。可以出現在一個接口的唯一字段必須聲明static和final.
-
接口不是由一個類擴展,它是由類實現.
-
一個接口可以擴展多個接口.
聲明接口:
interface關鍵字用於聲明一個接口。下麵是一個簡單的例子來聲明一個接口:
例子:
下麵來看看,描繪封裝一個例子:
/* File name : NameOfInterface.java */ import java.lang.*; //Any number of import statements public interface NameOfInterface { //Any number of final, static fields //Any number of abstract method declarations }
接口具有以下特性:
-
接口是隱式抽象的。聲明一個接口,不需要使用abstract關鍵字.
-
在接口中的每個方法也隱式抽象的,所以abstract關鍵字不需要。
-
在接口中的方法是隱式公開的。
例子:
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
接口的實現:
當一個類實現一個接口,可以認為該類同意將接口的具體行為。如果一個類不執行該接口的所有行為,該類必須自己聲明為abstract。
類使用implements關鍵字來實現一個接口。下麵的擴展聲明的部分implements關鍵字出現在類聲明。
/* File name : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
這將產生以下結果:
Mammal eats Mammal travels
當重寫接口中定義的方法有幾個應遵循的規則:
-
檢查型異常不應超過該接口的方法或那些由接口方法聲明的子類中聲明的那些其他的實現方法進行聲明。
-
重寫方法時,應保持接口的方法和相同的返回類型或子類型的簽名。
-
一個實現類本身可以是抽象的,如果是這樣的接口方法需要無法實施(實現)。
當要實現接口,需要了解有幾個規則:
-
一個類可以同時實現多個接口。
-
一個類隻能擴展一個類,但實現多個接口。
-
一個接口可以擴展另一個接口,類似於一個類可以擴展另一個類中的方法。
擴展接口:
一個接口可以擴展另一個接口,類似於一個類可以擴展另一個類中的方法。extends關鍵字來擴展接口,及子接口繼承父接口的方法。
下麵的Sports接口是由Hockey和Football接口擴展。
//Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } //Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } //Filename: Hockey.java public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
Hockey接口有四種方法,但它繼承了兩個來自Sports,因此,實現Hockey類需要實現所有六個方法。同樣地,一個實現Football 類需要定義從Football 的三種方法,並從Sports的兩種方法。
擴展多個接口:
一個Java類隻能繼承一個父類。多重繼承是不允許的。接口不是類,但是,一個接口可以擴展多個父接口。
extends關鍵字被使用一次,並且父接口在一個逗號分隔的列表中聲明。
例如,如果Hockey接口擴展兩個Sports和Event,將它聲明為:
public interface Hockey extends Sports, Event
標簽接口:
當父接口不包含任何方法的最常見的用途擴展接口發生。例如,在java.awt.event包中的MouseListener接口擴展java.util.EventListener繼承,它被定義為:
package java.util; public interface EventListener {}
其中不帶方法的接口被稱為標記接口。也有標記接口兩個基本的設計目的:
創建一個共同的父接口: 至於與事件監聽器接口,這是由幾十個Java API中的其他接口擴展,可以使用一個標記接口之間建立一組接口到一個共同的父接口。例如,當一個接口擴展事件監聽器,則JVM知道這個特定的接口是要在一個事件的代理方案來使用。
增加了數據類型到類: 這種情況就是術語標簽的由來。實現一個標記接口的類不需要定義任何方法(因為接口不具有任何),但通過類的多態性成為一個接口類型。