java基礎知識之接口

一,  接口的定義與描述


1,接口(英文:Interface),在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過實現接口的方式,從而來實現接口的抽象方法。

2,java接口(Interface),是一系列方法的聲明,是一些方法特徵的集合,這些方法特徵來自於具體方法,這些方法符合它們一般來自於一些在系統中不斷出現的方法。一個接口只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行爲,也就是可以具有完全不同的功能

3,在人們講到“接口”時,這個詞往往有兩種不同的含義:第一種是指Java接口,這是一種Java語言中存在的結構,有特定的語法和結構。第二種僅僅是指一個類所具有的方法的特徵集合,是一種邏輯上的抽象。前者叫做“Java接口”,後者叫做“接口”。

4,接口並不是類,編寫接口的方式和類很相似,但是它們屬於不同的概念。類描述對象的屬性和方法。接口則包含類要實現的方法。除非實現接口的類是抽象類,否則該類要定義接口中的所有方法。

5,接口把方法的特徵和方法的實現分割開來。這種分割,體現在接口常常代表一個角色(role),它包裝與該角色相關的操作和屬性,而實現這個接口的類便扮演這個角色的演員(類)。一個角色(接口)可以由不同的演員(類)來演,而不同的演員(類)之間除了扮演一個共同的角色(接口)之外,並不要求有任何其他的共同之處。


二,  接口的種類


1, 單方法接口,

以下是引用片段:

public interface IPeople{

          public abstract void eat(String food);

}

有且只有一個方法,只有實現了這個接口(重寫這個接口中的唯一一個方法),你纔有資格去事件監聽器列表裏註冊(參數爲IPeople類型),當事件源變動時,自動調用這個唯一的eat方法。這種接口是最常用也是最普遍的接口。

2,標識接口

這種接口是一種沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語意上的要求,它僅僅表明了實現它的類屬於一個特定的類型(傳遞), 供其他代碼來測試允許做一些事情。不推薦過多的使用標識接口。

標識接口作用:簡單形象的說就是給某個對象打個標(蓋個戳),使對象擁有某個或某些特權。

標識接口主要用於以下兩種目的

(1)建立一個公共的父接口:正如EventListener接口,這是由幾十個其他接口擴展的Java API,你可以使用一個標記接口來建立一組接口的父接口。例如:當一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用於一個事件的代理方案。

(2)向一個類添加數據類型:這種情況是標記接口最初的目的,實現標記接口的類不需要定義任何接口方法(因爲標記接口根本就沒有方法),但是該類通過多態性變成一個接口類型。

3,常量接口

用Java接口來聲明一些常量,然後由實現這個接口的類使用這些常量。

建議不要模仿這種常量接口的做法。


三,  接口的使用與注意點


1,接口文件創建規則如下:

  • 接口文件保存在 .java 結尾的文件中,文件名使用接口名。
  • 接口的字節碼文件保存在 .class 結尾的文件中。
  • 接口相應的字節碼文件必須在與包名稱相匹配的目錄結構中。

2,定義接口的基本格式如下:

[修飾符] interface [接口名]extends[父接口1,父接口2,...]

{

           [public] [static] [final] 常量;
           [public] [abstract] 方法;

}
修飾符:可選,用於指定接口的訪問權限,可選值爲public。如果省略則使用默認的訪問權限,也是public的。
接口名:必選參數,用於指定接口的名稱,接口名必須是合法的Java標識符。一般情況下,要求首字母大寫,一般爲了方便代碼閱讀,會在接口名前邊加上大寫字母“I”,以表示這個文件是個接口文件。

父接口名列表:可選參數,用於指定要定義的接口繼承於哪個父接口。當使用extends關鍵字時,父接口名爲必選參數。

常量:只能包含public,static,final類型的成員變量,這些成員變量必須被顯式初始化,即接口中的成員變量爲常量(大寫,單詞之間用"_"分隔)
方法:接口中的方法只有定義而沒有被實現,也就是沒有方法體,這些方法都會被隱式的指定爲public abstract(只能是 public abstract,其他修飾符都會報錯)

注意點:

  •  一個接口是可以使用extends關鍵字繼承接口,並且可以繼承多個接口,但是不能使用implements去實現接口。
  •  接口是隱式抽象的,當聲明一個接口的時候,可以不必使用abstract關鍵字,修飾符public也可以省略不寫
  •  一個接口可以有多個方法和常量。
  •  接口中是不能包含實例域或靜態方法的。

3,接口的實現格式

接口在定義後,就可以在類中實現該接口。在類中實現接口可以使用關鍵字implements,其基本格式如下:
[修飾符]  class  [類名] implements[接口1,接口2,...]

{


}
修飾符:可選參數,用於指定類的訪問權限,可選值爲public、abstract和final。
類名:必選參數,用於指定類的名稱,類名必須是合法的Java標識符。一般情況下,要求首字母大寫。

接口列表:可選參數,用於指定該類實現的是哪些接口。當使用implements關鍵字時,接口列表爲必選參數。當接口列表中存在多個接口名時,各個接口名之間使用逗號分隔。

 注意點:

  •  接口必須要有子類實現,一個子類可以使用implements關鍵字實現多個接口;
  •  當類實現了某個Java接口時,它必須實現接口中的所有抽象方法,否則這個類必須聲明爲抽象類,反過來說如果實現接口的類是抽象類,那麼就沒必要實現該接口的方法,也就是不需要重寫該方法。
  •   接口的對象可以利用子類對象的向上轉型進行實例化
  •   接口不是類,尤其不用使用new運算符實例一個接口,也就是說不能構造接口的對象,卻能聲明接口的變量。(出現在回調設計模式中,體現了Java的多態特性),該變量只能引用實現了接口的類對象。
  •   接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。
  •   類在重寫接口方法時,方法的名字參數的個數類型必須與接口中的完全一致,返回值應該保持相同或者相兼容。
  •   類在實現接口的方法時,不能拋出強制性異常,只能在接口中,或者繼承接口的抽象類中拋出該強制性異常。

4,同時繼承抽象類和實現接口格式

對於子類而言,除了實現接口外,還可以繼承抽象類。若既要繼承抽象類,同時還要實現接口的話,使用以下語法格式:

[修飾符] class[子類]extends[抽象類]implements[接口1,接口2...] {

 

}

修飾符:可選參數,用於指定類的訪問權限,可選值爲public、abstract和final。
子類:必選參數,用於指定類的名稱,類名必須是合法的Java標識符。一般情況下,要求首字母大寫。
抽象類:可選參數,用於指定要定義的類繼承於哪個父類。當使用extends關鍵字時,父類名爲必選參數。

接口參數列表:可選參數,用於指定該類實現的是哪些接口。當使用implements關鍵字時,接口列表爲必選參數。當接口列表中存在多個接口名時,各個接口名之間使用逗號分隔。


四,總結


(1)從接口的概念上來講,接口只能由抽象方法和全局常量組成,但是內部結構是不受概念限制的,正如抽象類中可以定義抽象內部類一樣,在接口中也可以定義普通內部類、抽象內部類和內部接口(但從實際的開發來講,用戶自己去定義內部抽象類或內部接口的時候是比較少見的)

(2)接口實現和類繼承的規則不同,爲了數據的安全,繼承時一個類只有一個直接父類,也就是單繼承,但是一個類可以實現多個接口,接口彌補了類的不能多繼承缺點,繼承和接口的雙重設計既保持了類的數據安全也變相實現了多繼承。

(3)接口無法被實例化,但是可以被實現。一個實現接口的類,必須實現接口內所描述的所有方法,否則就必須聲明爲抽象類。另外,在 Java 中,接口類型可用來聲明一個變量,他們可以成爲一個空指針,或是被綁定在一個以此接口實現的對象。

(4)Java接口本身沒有任何實現,因爲Java接口不涉及表象,而只描述public行爲,所以Java接口比Java抽象類更抽象化。但是接口不是類,不能使用new 運算符實例化一個接口

如 x=new comparable(......);//這個是錯誤來的。但是可以聲明接口變量Comparable x; //這是允許的。

(5)Java接口的方法只能是抽象的和公開的,Java接口不能有構造器,Java接口可以有public、靜態的和final屬性。即接口中的屬性可以定義爲 public static final int value=5;

(6)如果一個類已經有了一個主要的超類型,那麼通過實現一個接口,這個類可以擁有另一個次要的超類型,這種次要的超類型叫做混合類型。

 

,舉例說明


/**
 
* 申明接口人
 
* 默認規則會在接口名前邊加大寫字母“I”,以便於區分該文件爲接口文件。
 */
//public abstract interface IPeople {//關鍵字
//abstract interface IPeople {
interface IPeople  extends Eat,Sleep{//一個接口是可以使用extends關鍵字繼承接口,並且可以繼承多個接口
    //申明常量,可以有多個常量,成員常量具有固定的修飾符:public static final
    //public static final int data = 0;//public,static,final這三個修飾符都可以省略不寫,
    int DATA = 0;//常量必須要顯式初始化,否則會引起報錯
   
public static final double NUM=0;
  
 //申明方法,可以有多個方法。
   
public abstract void drink(Stringfood);//public,abstract這兩個修飾符都可以省略不寫
    int singing();//方法禁止用static,final,private等修飾符修飾
}


 

//接口吃飯
public interface Eat{
   
/**
    
* 方法吃飯
    
* @param what 要吃的食物
    
*/
    public void eat(Stringwhat);

}


//接口睡覺
public interface Sleep{
   
/**
    
* 方法睡覺
    
* @param bed 睡在什麼樣的牀上
    
*/
    public void sleep(Stringbed);

}

 /**
 
* 創建類XiaoCui實現IPeople接口
 */
//可以同時繼承抽象類並且實現多個接口
public class XiaoCui  extends People  implements IPeople,Sleep{
   
//如果一個類實現了接口中的方法,那麼只實現一次就可以了。即使繼承了兩次接口
   
//一個子類可以使用implements關鍵字實現多個接口
    //必須要實現其中的兩個抽象方法,否則會報錯,除非將這個類申明爲抽象類

    public void cry() {//可以擁有自己的方法
       
System.out.println("哭");
   
}
   
@Override
   
public void run(){//實現抽象類People中的抽象方法
        System.out.println("跑");
   
}
   
@Override
   
public void drink(String food) {//實現IPeople接口中的方法
        System.out.println("喝水");
   
}
   
@Override
   
public int singing() {//實現IPeople接口中的方法
        System.out.println("唱歌");
       
return 0;//類在重寫接口方法時,方法的名字、參數的個數及類型必須與接口中的完全一致,返回值應該保持相同或者相兼容。
   
}
   
@Override
   
public void eat(String what) {//實現接口Eat中的方法,
                // 雖然這個類沒有直接實現接口Eat,但是接口IPeople繼承了接口Eat,所以必須要實現這個方法。
        System.out.println("吃飯");
   
}
   
//實現接口Sleep中的抽象方法
    @Override
   
public void sleep(String bed) {
       
System.out.println("睡覺");
   
}

   
publicstatic void main(String[]args){
       
XiaoCui  xiaocu i= new XiaoCui();//實例化子類對象
       
IPeople  people= xiaocui;//接口的對象可以利用子類對象的向上轉型進行實例化。
       
Sleep sleep= xiaocui;//該變量只能引用實現了接口的類對象。
     
// Sleep sleep = new Sleep(); //接口不是類,尤其不用使用new運算符實例一個接口
        people.drink("hh");
       
people.singing();
       
sleep.sleep("dd");
   
}
}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章