什麼是接口?接口是怎麼來的?java
一、抽象類是從多個類中抽象出來的模板,若是將這種抽象進行的更完全,則能夠提煉出一種更加特殊的「抽象類」:接口(interface)設計
二、接口裏全部方法都是抽象方法,不能包含普通方法(Java8以前)3d
三、接口定義了某一批類須要遵照的規範(經過接口內定義的一堆抽象方法),接口並不關心這些子類內部方法的具體實現,只規定這些類必須實現哪些方法blog
因此:接口是從多個類中抽象出來的一種規範,接口不提供任何實現,接口體現的是規範和實現分離的設計哲學繼承
四、讓規範和實現分離正是接口的好處,讓軟件系統的各組件之間面向接口耦合,是一種鬆耦合的設計。接口
例如:一塊主機板上提供了PCI插槽,只要一塊顯卡遵照該PCI接口規範,就能夠插入該PCI插槽,與主機板正常通訊,至於這塊主板是哪一個廠家生產的,內部是如何實現的,主板無需關心(主板插槽PCI規範就至關於接口內定義的一批抽象方法,顯卡至關於實現該接口的類,顯卡遵照PCI規範至關於該子類按照接口規定的抽象方法,挨個的去實現了這些方法,但至於方法內具體實現規則,接口並不關心,就像主板並不關心顯卡內部是怎麼製造的同樣)get
相似的:軟件設計的各模塊之間,也應該採用這種面向接口的耦合,儘可能下降模塊之間的耦合,爲系統提供更好的可擴展性和可維護性編譯
所以:接口的定義是多個類共同的公共行爲規範,這些行爲是與外部交流的通道,這就意味着接口裏一般定義一組公用方法模板
Java8中接口的定義:class
一、和類定義不一樣,接口定義再也不使用class關鍵字,而是使用 interface 關鍵字,接口定義的語法以下:
[修飾符] interface 接口名 extends 父接口1,父接口2,...{ 零個到多個常量定義; 零個到多個抽象方法定義; 零個到多個內部類、接口、枚舉定義; 零個到多個默認方法或類方法定義; }
對上面語法的詳細說明:
一、修飾符能夠是 public 或者省略,若是省略,則採用包權限訪問控制符
二、接口名稱與類名稱採用相同的命名規則,僅從語法的語義看,接口名稱只要是合法的標識符便可,若是遵照Java 可讀性程序規範,接口名稱應該是多個有意義的單詞組合,每一個單詞首字符大寫
三、一個接口能夠有多個直接父接口,但接口只能繼承接口,不能繼承類
四、上面的定義接口語法中,只有在Java8以上的版本中,接口內才能夠定義默認方法,類方法,在Java8之前的版本中,接口內只能定義抽象方法,不能定義其它方法
總結:
一、由於接口是一種規範,因此接口內不能定義初始化塊、構造器
二、接口能夠包含成員變量,但只能是靜態常量
三、接口能夠包含方法,但只能是抽象方法、默認方法、類方法
四、接口能夠包含內部類,但只能是接口、枚舉
五、由於接口定義的是一種多個類的行爲規範,因此接口內定義的全部成員,都是 public 訪問權限,所以定義接口成員時,能夠省略 public 修飾符
六、由於接口內定義的成員變量 必須是靜態常量,因此定義成員變量時前面的 public static final 是固定的,因此能夠省略該固定三個關鍵字,系統會自動爲定義的成員變量加上 public static final
七、由於接口裏沒有構造器、初始化塊等,因此定義的全部成員變量必須賦初始值
八、由於接口裏定義的方法只能是抽象方法、默認方法或類方法,因此全部定義的抽象方法中,前面能夠省略 public abstract 這倆關鍵字,系統會默認給加上;全部定義的默認方法必須用 default 修飾, 類方法必須用 static修飾,必須有方法體
九、從某個角度看,接口是一種特殊的類,所以一個Java文件裏最多隻能有一個 public 類型接口,而且該源文件名字必須與 public 類型接口相同
定義一個接口 代碼:
package zd; public interface InterfaceOutPut{ //-定義一個常量 公共、靜態、不可變、賦初始值 public static final int a=20; //-定義兩個抽象方法 public abstract void Out(); public abstract String getData(String mes); //-定義兩個默認方法,必須用default修飾 public default void print(String... mes){ for(String str:mes){ System.out.println(str); } } public default void test(){ System.out.println("接口中的默認方法!"); } //-定義一個類方法,必須用static 修飾 public static String staticTest(){ return "接口中的類方法!"; } }
定義一個類,調用該接口中的方法與成員變量;
package zdy; public class InterfaceOutPutFieldTest{ public static void main(String[] args){ //-調用另外一個包中的接口常量 System.out.println(zd.InterfaceOutPut.a); //-給另外一個包中的接口常量從新賦值 編譯錯誤 由於是final 類型 //zd.InterfaceOutPut.a=25; //-調用另外一個包中的接口 類方法 System.out.println(zd.InterfaceOutPut.staticTest()); //-調用另外一個包中的接口 默認方法 編譯報錯 靜態方法不能訪問非靜態方法 //zd.InterfaceOutPut.test(); } }
運行結果: