接口是抽象方法的集合。如果一個類實現(xiàn)了一個接口,那么就需要繼承這個接口中的所有抽象方法。
接口不是類。寫一個接口和寫一個類很相似,但是它們是兩個不同的概念。類是描述一個對象的成員屬性和行為。接口只包含一個類所實現(xiàn)的行為。
除非實現(xiàn)了接口的類是抽象的,否則接口中的所有方法都需要在類中實現(xiàn)。
在以下方面,接口和類非常相似:
.java
的擴(kuò)展名寫入文件中,并且接口的名字與文件名相同。.class
文件中。然而,在以下方面,接口和類是不同的:
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\
}
接口有下述屬性:
abstract
關(guān)鍵字。abstract
關(guān)鍵字也不需要。/* File name : Animal.java */
interface Animal {
public void eat();
public void travel();
}
當(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ī)則:
當(dāng)實現(xiàn)接口時有如下幾條規(guī)則:
一個接口可以繼承另一個接口,和一個類繼承自另一個類的方法相同。 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
繼承接口的最普通用法是父接口不包含任何的方法。例如, 在 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)的特性變成了一個接口類型。