Java 接口
接口( interface ) 是一個(gè)抽象類型嘱根,是抽象方法的集合
接口通常以 interface 來聲明
一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法
接口并不是類斜脂,編寫接口的方式和類很相似雇卷,但是它們屬于不同的概念
- 類描述對(duì)象的屬性和方法
- 接口則包含類要實(shí)現(xiàn)的方法
除非實(shí)現(xiàn)接口的類是抽象類驰贷,否則該類要定義接口中的所有方法
接口無法被實(shí)例化,但是可以被實(shí)現(xiàn)
一個(gè)實(shí)現(xiàn)接口的類昨寞,必須實(shí)現(xiàn)接口內(nèi)所描述的所有方法瞻惋,否則就必須聲明為抽象類
Java 中,接口類型可用來聲明一個(gè)變量援岩,他們可以成為一個(gè)空指針歼狼,或是被綁定在一個(gè)以此接口實(shí)現(xiàn)的對(duì)象
接口與類相似點(diǎn)
- 一個(gè)接口可以有多個(gè)方法
- 接口文件保存在 .java 結(jié)尾的文件中,文件名使用接口名
- 接口的字節(jié)碼文件保存在 .class 結(jié)尾的文件中
- 接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中
接口與類的區(qū)別
- 接口不能用于實(shí)例化對(duì)象
- 接口沒有構(gòu)造方法
- 接口中所有的方法必須是抽象方法
- 接口不能包含成員變量享怀,除了 static 和 final 變量
- 接口不是被類繼承了羽峰,而是要被類實(shí)現(xiàn)
- 接口支持多繼承
接口特性
- 接口中每一個(gè)方法也是隱式抽象的,接口中的方法會(huì)被隱式的指定為 public abstract ( 只能是 public abstract,其他修飾符都會(huì)報(bào)錯(cuò) )
- 接口中可以含有變量,但是接口中的變量會(huì)被隱式的指定為 public static final 變量(并且只能是 public梅屉,用 private 修飾會(huì)報(bào)編譯錯(cuò)誤 )
- 接口中的方法是不能在接口中實(shí)現(xiàn)的值纱,只能由實(shí)現(xiàn)接口的類來實(shí)現(xiàn)接口中的方法
抽象類和接口的區(qū)別
- 抽象類中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能坯汤,但是接口中的方法不行
- 抽象類中的成員變量可以是各種類型的虐唠,而接口中的成員變量只能是 public static final 類型的
- 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法
- 一個(gè)類只能繼承一個(gè)抽象類惰聂,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口
定義一個(gè)接口
interface 關(guān)鍵字用來聲明一個(gè)接口
[可見度] interface 接口名稱 [extends 其他的類名] {
// 聲明變量
// 抽象方法
}
下面的代碼定義了一個(gè) NameOfInterface 接口
import java.lang.*;
public interface NameOfInterface
{
//任何類型 final, static 字段
//抽象方法
}
接口有以下特性
- 接口是隱式抽象的疆偿,當(dāng)聲明一個(gè)接口的時(shí)候,不必使用 abstract 關(guān)鍵字
- 接口中每一個(gè)方法也是隱式抽象的搓幌,聲明時(shí)同樣不需要 abstract 關(guān)鍵字
- 接口中的方法都是公有的
interface Animal {
public void eat();
public void travel();
}
實(shí)現(xiàn)接口
類使用 implements 關(guān)鍵字實(shí)現(xiàn)接口
在類聲明中杆故,implements關(guān)鍵字放在 class 聲明后面
當(dāng)類實(shí)現(xiàn)接口的時(shí)候,類要實(shí)現(xiàn)接口中所有的方法溉愁,否則反番,類必須聲明為抽象的類
...implements 接口名稱[, 其他接口, 其他接口..., ...] ...
下面的代碼定義了一個(gè)類 MammalInt 實(shí)現(xiàn)了 Animal 接口
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();
}
}
編譯運(yùn)行以上 Java 代碼,輸出結(jié)果如下
Mammal eats
Mammal travels
重寫接口中聲明的方法時(shí)叉钥,需要注意以下規(guī)則
- 類在實(shí)現(xiàn)接口的方法時(shí),不能拋出強(qiáng)制性異常篙贸,只能在接口中投队,或者繼承接口的抽象類中拋出該強(qiáng)制性異常
- 類在重寫方法時(shí)要保持一致的方法名,并且應(yīng)該保持相同或者相兼容的返回值類型
- 如果實(shí)現(xiàn)接口的類是抽象類爵川,那么就沒必要實(shí)現(xiàn)該接口的方法
在實(shí)現(xiàn)接口的時(shí)候敷鸦,也要注意一些規(guī)則
- 一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口
- 一個(gè)類只能繼承一個(gè)類,但是能實(shí)現(xiàn)多個(gè)接口
- 一個(gè)接口能繼承另一個(gè)接口寝贡,這和類之間的繼承比較相似
接口的繼承
一個(gè)接口能繼承另一個(gè)接口扒披,和類之間的繼承方式比較相似
接口的繼承使用 extends 關(guān)鍵字,子接口繼承父接口的方法
下面的代碼中圃泡, Sports 接口被 Hockey 和 Football 接口繼承
// 文件名: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
Hockey 接口自己聲明了四個(gè)方法碟案,從 Sports 接口繼承了兩個(gè)方法,這樣颇蜡,實(shí)現(xiàn) Hockey 接口的類需要實(shí)現(xiàn)六個(gè)方法
類似的价说,實(shí)現(xiàn) Football 接口的類需要實(shí)現(xiàn)五個(gè)方法,其中兩個(gè)來自于 Sports 接口
接口的多繼承
Java中风秤,類的多繼承是不合法鳖目,但接口允許多繼承
接口的多繼承中 extends 關(guān)鍵字只需要使用一次,在其后跟著繼承接口
public interface Hockey extends Sports, Event{}
空接口
空接口就是沒有包含任何方法的接口
空接口是沒有任何方法和屬性的接口缤弦,它僅僅表明它的類屬于一個(gè)特定的類型,供其他代碼來測試允許做一些事情
空接口作用:簡單形象的說就是給某個(gè)對(duì)象打個(gè)標(biāo) (蓋個(gè)戳 )领迈,使對(duì)象擁有某個(gè)或某些特權(quán)
例如:java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下
package java.util;
public interface EventListener {}