Java 接口

Java 接口

接口( interface ) 是一個(gè)抽象類型嘱根,是抽象方法的集合

接口通常以 interface 來聲明

一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法

接口并不是類斜脂,編寫接口的方式和類很相似雇卷,但是它們屬于不同的概念

  1. 類描述對(duì)象的屬性和方法
  2. 接口則包含類要實(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)

  1. 一個(gè)接口可以有多個(gè)方法
  2. 接口文件保存在 .java 結(jié)尾的文件中,文件名使用接口名
  3. 接口的字節(jié)碼文件保存在 .class 結(jié)尾的文件中
  4. 接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中

接口與類的區(qū)別

  1. 接口不能用于實(shí)例化對(duì)象
  2. 接口沒有構(gòu)造方法
  3. 接口中所有的方法必須是抽象方法
  4. 接口不能包含成員變量享怀,除了 static 和 final 變量
  5. 接口不是被類繼承了羽峰,而是要被類實(shí)現(xiàn)
  6. 接口支持多繼承

接口特性

  1. 接口中每一個(gè)方法也是隱式抽象的,接口中的方法會(huì)被隱式的指定為 public abstract ( 只能是 public abstract,其他修飾符都會(huì)報(bào)錯(cuò) )
  2. 接口中可以含有變量,但是接口中的變量會(huì)被隱式的指定為 public static final 變量(并且只能是 public梅屉,用 private 修飾會(huì)報(bào)編譯錯(cuò)誤 )
  3. 接口中的方法是不能在接口中實(shí)現(xiàn)的值纱,只能由實(shí)現(xiàn)接口的類來實(shí)現(xiàn)接口中的方法

抽象類和接口的區(qū)別

  1. 抽象類中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能坯汤,但是接口中的方法不行
  2. 抽象類中的成員變量可以是各種類型的虐唠,而接口中的成員變量只能是 public static final 類型的
  3. 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法
  4. 一個(gè)類只能繼承一個(gè)抽象類惰聂,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口

定義一個(gè)接口

interface 關(guān)鍵字用來聲明一個(gè)接口

[可見度] interface 接口名稱 [extends 其他的類名] {
// 聲明變量
// 抽象方法
}

下面的代碼定義了一個(gè) NameOfInterface 接口

import java.lang.*;

public interface NameOfInterface
{
   //任何類型 final, static 字段
   //抽象方法
}

接口有以下特性

  1. 接口是隱式抽象的疆偿,當(dāng)聲明一個(gè)接口的時(shí)候,不必使用 abstract 關(guān)鍵字
  2. 接口中每一個(gè)方法也是隱式抽象的搓幌,聲明時(shí)同樣不需要 abstract 關(guān)鍵字
  3. 接口中的方法都是公有的
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 {}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狸捅,更是在濱河造成了極大的恐慌衷蜓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪贫,死亡現(xiàn)場離奇詭異恍箭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞧省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門扯夭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞍匾,你說我怎么就攤上這事交洗。” “怎么了橡淑?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵构拳,是天一觀的道長。 經(jīng)常有香客問我梁棠,道長置森,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任符糊,我火速辦了婚禮凫海,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘男娄。我一直安慰自己行贪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布模闲。 她就那樣靜靜地躺著建瘫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尸折。 梳的紋絲不亂的頭發(fā)上啰脚,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音实夹,去河邊找鬼拣播。 笑死,一個(gè)胖子當(dāng)著我的面吹牛收擦,可吹牛的內(nèi)容都是我干的贮配。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼塞赂,長吁一口氣:“原來是場噩夢啊……” “哼泪勒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤圆存,失蹤者是張志新(化名)和其女友劉穎叼旋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沦辙,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夫植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了油讯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片详民。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陌兑,靈堂內(nèi)的尸體忽然破棺而出沈跨,到底是詐尸還是另有隱情,我是刑警寧澤兔综,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布饿凛,位于F島的核電站,受9級(jí)特大地震影響软驰,放射性物質(zhì)發(fā)生泄漏涧窒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一锭亏、第九天 我趴在偏房一處隱蔽的房頂上張望杀狡。 院中可真熱鬧,春花似錦贰镣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹬音,卻和暖如春上煤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背著淆。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工劫狠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人永部。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓独泞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苔埋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懦砂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 抽象類的定義 Java核心技術(shù)卷1: 1.為了提高程序的清晰度,包含一個(gè)或者多個(gè)抽象方法的類本身必須被聲明為抽象的...
    Sunflow007閱讀 465評(píng)論 0 0
  • 接口(英文:Interface),在JAVA編程語言中是一個(gè)抽象類型荞膘,是抽象方法的集合罚随,接口通常以interfac...
    南風(fēng)_001閱讀 215評(píng)論 0 0
  • Java接口(interface) 接口(英文:Interface),在JAVA編程語言中是一個(gè)抽象類型羽资,是抽象方...
    YQY_苑閱讀 13,691評(píng)論 0 0
  • 對(duì)于面向?qū)ο缶幊虂碚f淘菩,抽象是它的一大特征之一。在Java中屠升,可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類潮改。這兩...
    dlihasa閱讀 279評(píng)論 0 0
  • 《大頭妹》繪本內(nèi)容:大頭妹的媽媽給大頭妹剪了一個(gè)凸凸的頭發(fā),大家都嘲笑她弥激,大頭妹對(duì)這個(gè)頭發(fā)實(shí)在是不滿意进陡。媽媽...
    5fc9b6559467閱讀 276評(píng)論 0 0