鍍金池/ 教程/ Java/ Java 接口
Java 接口
Java 方法
Java 數(shù)字
Java 條件判斷
Java 異常處理
Java 字符
Java 重寫
Java 網(wǎng)絡(luò)編程
Java 數(shù)據(jù)結(jié)構(gòu)
Java 的對象和類
Java 多線程
Java 封裝
Java 數(shù)組
Java Applet 基礎(chǔ)
Java 庫類
Java 抽象
Java 繼承
Java 正則表達(dá)式
Java 描述符的類型
Java 發(fā)送郵件
Java 序列化
Java 泛型
Java 多態(tài)
Java 變量類型
Java 基本數(shù)據(jù)類型
Java 包
Java 快速參考指南
Java 基本運算符
Java 概述
Java 字符串
Java 循環(huán)控制
Java 環(huán)境設(shè)置
Java 文件注釋
Java 文件和 I/O
Java 集合
Java 基本語法
Java 日期和時間

Java 接口

接口是抽象方法的集合。如果一個類實現(xiàn)了一個接口,那么就需要繼承這個接口中的所有抽象方法。

接口不是類。寫一個接口和寫一個類很相似,但是它們是兩個不同的概念。類是描述一個對象的成員屬性和行為。接口只包含一個類所實現(xiàn)的行為。

除非實現(xiàn)了接口的類是抽象的,否則接口中的所有方法都需要在類中實現(xiàn)。

在以下方面,接口和類非常相似:

  • 一個接口可以包含任意數(shù)量的方法。
  • 一個接口以 .java 的擴(kuò)展名寫入文件中,并且接口的名字與文件名相同。
  • 接口的字節(jié)碼位于一個 .class 文件中。
  • 接口位于包中,并且相應(yīng)的字節(jié)碼文件必須在和該包名匹配的文件夾結(jié)構(gòu)下。

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

  • 不能實例化一個接口。
  • 接口不能包含構(gòu)造方法。
  • 接口中的所有方法都是抽象的。
  • 接口不能包含實例變量。接口中唯一能出現(xiàn)的變量必須被同時聲明為 static 和 final 。
  • 接口不能被類繼承;它應(yīng)該被類實現(xiàn)。
  • 一個接口可以繼承多個接口。

聲明接口

interface 關(guān)鍵字用來聲明一個接口。下面是一個聲明接口的簡單例子:

示例

如下是描述了接口的例子:

/* 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\
}

接口有下述屬性:

  • 接口默認(rèn)就是抽象的。當(dāng)需要聲明一個接口的時候不需要使用 abstract 關(guān)鍵字。
  • 接口中的每個方法默認(rèn)也是抽象的,所以 abstract 關(guān)鍵字也不需要。
  • 接口中的方法默認(rèn)是 public 的。

示例:

/* File name : Animal.java */
interface Animal {

   public void eat();
   public void travel();
}

接口的實現(xiàn)

當(dāng)一個類實現(xiàn)一個接口的時候,你可以認(rèn)為類就是簽訂一個條約,同意去執(zhí)行接口中的各種行為。如果一個類沒有實現(xiàn)接口中的所有行為,這個類就必須聲明為 abstract 。

類使用 implements 關(guān)鍵字來實現(xiàn)一個接口。這個 implements 關(guān)鍵字寫在類的聲明部分中 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();
   }
} 

這將產(chǎn)生下面的結(jié)果:

Mammal eats
Mammal travels

當(dāng)覆寫定義在接口中的方法時,如下是需要遵守的幾條規(guī)則:

  • 異常不應(yīng)該聲明在實現(xiàn)的方法中,而是應(yīng)該在聲明的接口方法中或者那些聲明方法的接口的子類。
  • 當(dāng)覆寫方法的時候應(yīng)該包含接口方法的簽名和相同類型或子類型的返回值。
  • 接口實現(xiàn)類本身可以是抽象的,如果是抽象的,則接口中的方法沒必要全部實現(xiàn)。

當(dāng)實現(xiàn)接口時有如下幾條規(guī)則:

  • 類可以一次性實現(xiàn)多個接口。
  • 類只可以繼承一個父類,但是可以實現(xiàn)多個接口。
  • 一個接口可以繼承自另一個接口,和一個類繼承自另一個類的方法相同。

接口的繼承

一個接口可以繼承另一個接口,和一個類繼承自另一個類的方法相同。 extends 關(guān)鍵字用來繼承一個接口,并且子接口要繼承父接口的所有方法。

下述的 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 接口中繼承了兩個;因此,一個實現(xiàn)了 Hockey 接口的類需要實現(xiàn)全部的六個方法。類似的,實現(xiàn)了 Football 的類需要定義 Football 接口中三個方法和 Sports 接口中的兩個方法。

多個接口的繼承

一個 Java 類只可以繼承一個父類,不可以多繼承。 然而,接口不是類,一個接口可以繼承多個父接口。

一旦使用了 extends 關(guān)鍵字,所有父接口聲明時需要以逗號分隔。

例如,如果 Hockey 接口同時繼承了 Sports 和 Event 接口,它需要像如下方式聲明:

public interface Hockey extends Sports, Event

標(biāo)識接口

繼承接口的最普通用法是父接口不包含任何的方法。例如, 在 java.awt.event 包中的 MouseListener 接口繼承了 java.util.EventListener 接口,像如下定義:

package java.util;
public interface EventListener
{}

一個內(nèi)部沒有任何方法的接口被稱為 tagging interface。 tagging interface 有兩個基本的用途:

創(chuàng)建一個共同的父類: 像 EventListener 接口, 它繼承了很多 Java API 中的其它接口,你可以使用 tagging interface 在一組接口中創(chuàng)建一個共同的父類。例如,當(dāng)一個接口繼承了 EventListener 接口的時候, Java 虛擬機(JVM)就知道這個特殊的接口被用在事件代理上。

向類添加數(shù)據(jù)類型: 一個實現(xiàn)了 tagging interface 的類是不需要定義任何方法的(因為這個接口中本來就沒有任何方法),但是這個類通過多態(tài)的特性變成了一個接口類型。

上一篇:Java 抽象下一篇:Java 字符串