Java/接口

維基教科書,自由的教學讀本

C++中提供了多重繼承的機制,即一個類可以有很多個父類,但是多重繼承導致的奇異性一直引發很多爭議,所以許多語言並不支援多重繼承,而改以單一繼承和接口繼承。 Java提供了關鍵字interface來申明一個接口。接口可以規定方法的原型:方法名、參數列表以及返回類型,但不規定方法主體。interface 關鍵字用來聲明一個接口。

接口的定義格式

interface 接口名称{ 
final 数据类型 成员名称 = 常量 ;
//数据成员必须赋值初值
abstract 返回值的数据类型 方法名称参数…);
//在抽象方法里,没有定义处理的方式
}

接口有下述屬性:

  1. 接口默認就是抽象的。當需要聲明一個接口的時候不需要使用 abstract 關鍵字。
  2. 接口中的每個方法默認也是抽象的,所以 abstract 關鍵字也不需要。
  3. 接口中的方法默認是 public 的。


示例:

/* File name : Animal.java */
interface Animal {
public void eat();
public void travel();
}

接口的實現 當一個類實現一個接口的時候,你可以認為類就是簽訂一個條約,同意去執行接口中的各種行為。如果一個類沒有實現接口中的所有行為,這個類就必須聲明為 abstract類。使用 implements 關鍵字來實現一個接口。這個 implements 關鍵字寫在類的聲明部分中 extends(如果有) 部分的後面。

/* 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 當覆寫定義在接口中的方法時,如下是需要遵守的幾條規則:

  1. 異常不應該聲明在實現的方法中,而是應該在聲明的接口方法中或者那些聲明方法的接口的子類。
  2. 當覆寫方法的時候應該包含接口方法的簽名和相同類型或子類型的返回值。
  3. 接口實現類本身可以是抽象的,如果是抽象的,則接口中的方法沒必要全部實現。

當實現接口時有如下幾條規則:

  1. 類可以一次性實現多個接口。
  2. 類只可以繼承一個父類,但是可以實現多個接口。
  3. 一個接口可以繼承自另一個接口,和一個類繼承自另一個類的方法相同。

接口的繼承

一個接口可以繼承另一個接口,和一個類繼承自另一個類的方法相同。 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);
}


接口類有以下幾個要求:

  1. 接口不能用於實例化對象。
  2. 接口沒有構造方法。
  3. 接口不能包含成員變量,除了static和final變量。
  4. 接口中的所有的方法必須是抽象方法。
  5. 接口不是被類繼承了,而是要被類實現。
  6. 接口支持多重繼承。

接口是抽象方法的集合。如果一個類實現了一個接口,那麼就需要繼承這個接口中的所有抽象方法。 接口不是類。寫一個接口和寫一個類很相似,但是它們是兩個不同的概念。類是描述一個對象的成員屬性和行 為。接口只包含一個類所實現的行為。 除非實現了接口的類是抽象的,否則接口中的所有方法都需要在類中實現。 在以下方面,接口和類非常相似:

  1. 一個接口可以包含任意數量的方法。
  2. 一個接口以 .java 的擴展名寫入文件中,並且接口的名字與文件名相同。
  3. 接口的字節碼位於一個 .class 文件中。
  4. 接口位於包中,並且相應的字節碼文件必須在和該包名匹配的文件夾結構下。

然而,在以下方面,接口和類是不同的:

  1. 不能實例化一個接口。
  2. 接口不能包含構造方法。
  3. 接口中的所有方法都是抽象的。
  4. 接口不能包含實例變量。接口中唯一能出現的變量必須被同時聲明為 static 和 final 。
  5. 接口不能被類繼承;它應該被類實現。
  6. 一個接口可以繼承多個接口。