「JAVA」多態的靈魂,面向接口的程序設計,這纔是你該懂得的接口(interface)

Java面向對象之接口——interface

Java面向對象之接口——interface

什麼是接口

一般計算機中的接口分爲硬件接口軟件接口

  • 硬件接口:是指兩個硬件設備之間的連接方式,既包括物理上的接口,還包括邏輯上的數據傳送協議。

  • 軟件接口:通常是指程序代碼,在Java中表示一種特殊的類,是具有的N個方法的特徵集合,表示一種規範;還有一種情況數據接口,表示客戶端和服務端之間的數據交互的方式。

比如,顯示器中封裝了很多電子元器件,這些元器件連接在一起爲顯示器的正常共工作提供支持,那麼顯示器如何與外界的其他設備(如電腦主機、外放音響、耳機等設備)通信交互呢?也是通過顯示暴露的通信接口——顯示器上暴露的“孔”。通過連接這些“孔”,其他設備就能和顯示器一起工作,能夠獲取顯示器中的信息數據,也能夠爲顯示器提供一些顯示器不具備的功能,比如:優質的音響效果。

接口的設計目的:從上述的顯示器例子中,不難發現,接口可以看作是設備和設備之間的通信橋樑,通過交換數據完成通信。接口表示一種規範/約束/實現者必須遵循的規範,目的就是用來約束使用者應該怎麼做。那如果沒有這些規範(接口),會出現什麼樣的問題?

手機的充電器就是接口的實際應用的一個極好的例子。在如今這個智能機氾濫的年代,不知道大家有沒有懷念當年功能機和山寨機橫行的年代;在那些年代,手機之間的充電設備,各個品牌有各個品牌的“特色”,各個品牌均不一樣。

如果充電設備丟了,或者損壞了,往往要花費很大的代價才能才能買到新的,所以在當時的萬能充電器才能流行一時,但其充電效果卻並不如人意。由此帶來的問題極大的困擾了廣大手機用戶。

各有特色的功能機充電器

直到Android系統的出現,統一了充電接口規範後,這個問題纔得到了有效解決。因爲安卓系統統一了手機充電接口規範,所以幾乎所有的Android手機的充電接口是相同的( Micro-USB/Type-c/Lightning)。當然了,蘋果手機是個特立獨行的大佬,不在討論的範圍之內。

USB接口

生活中,USB接口和我們經常接說的USB插槽其實是有所偏差的,其並不是我們平時所看到的那些USB插槽,而是那些USB插槽所遵循的一種規範(標準)。USB的英文是Universal Serial Bus(通用串行總線),用於規範電腦與外部設備的連接和通訊,廣泛應用於PC領域的接口技術。

我們所看到的那些USB插槽是根據USB接口規範設計出來的產品,對於不同型號的USB設備而言,他們各自的USB插槽都需要遵循同一個規範,如此可以保證任何插入USB插槽的設備都能與主板正常通信。

USB接口和USE設備實現了真正的多態

對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實現細節;在面向對象的思想中,可認爲他們都是同一個類的不同實例,也就是說USB插槽是USB規範的實例。

接口只定義了應當遵循的規範,卻並不關心這些規範的內部數據和其功能的實現細節,從而分離了規範和實現,增強了系統的可拓展性和可維護性。這樣做的好處:比如,主板上提供了USB插槽,只要一個遵循了USB規範的鼠標,就可以插入USB插槽,並與主板正常通信,而不必關心至於這個鼠標的廠商,鼠標內部實現。當鼠標壞了的時候,只需要換個鼠標就行。

Java中的接口

Java中的接口,書面解釋是多個抽象類的抽象就是接口;通俗點說,在Java中最小的程序單元是類,而接口其實是一個特殊的類。和USB接口一樣,Java中的接口也表示規範,用於定義一組抽象方法,表示某一類事物必須具備的功能,接口的實現類來實現該接口並提供接口中每個方法的實現。

  • 定義類語法: 權限修飾符 class 類名{}

  • 定義接口語法: 權限修飾符 interface 接口名{}

接口的命名:

  1. 表示具有某些能力的,可以以able/handler結尾。如: Walkable.java

  2. 以I開頭表示接口,如:IWalkable.java

接口在編譯成功之後,和類一樣,也是.class的字節碼文件。

接口中的成員:

1.接口中沒有構造器,因爲接口不能使用new關鍵字創建對象(不能 new);

2.接口中不能定義普通方法,接口中的方法都是默認爲公共的抽象方法,而且都是 public abstract 修飾的;所以接口中的方法的public符 和 abstract 修飾符是可以省略不寫的;

3.接口中定義的成員變量,實質是全局靜態常量,默認使用 public static final來修飾;

  • public static final String NAME = "老夫不正經";

4.接口中定義的內部類都是公共的靜態內部類,默認使用public static來修飾內部類.

  • public static interface Openable {}

標誌接口:沒有任何成員,僅僅提供一個接口定義的接口,其就只是一個標誌,若有類實現該接口,則該類就屬於接口這一派系。這個使用的不多,瞭解就好。

常量接口:使用接口來封裝多個常量信息,稱之爲常量接口,其目的和普通常量類相同,但在這裏不建議使用。

接口的特點

  1. 接口沒有構造器,更不能顯式定義構造器,故接口不能被實例化。

  2. 接口裏的方法方法全是抽象公共的,默認修飾符是public abstract

  3. 接口裏的字段全是全局靜態常量,默認修飾符是public static final

  4. 接口裏的內部類全是公共靜態的,默認修飾符是public static

接口的繼承:

接口只能繼承接口,不能繼承類,且接口支持多繼承(類是單繼承關係)。接口繼承語法如下:

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

類和類之間的繼承關係用extends關鍵字來表示,接口和接口之間也只能是繼承關係,也使用extends 關鍵字來表示。

接口和實現類之間只能是實現關係,而且是類實現接口,用implements關鍵字來表示。

類和接口的實現關係

接口的實現

接口僅僅只是定義了某一類事物應該具有某些功能,但是沒有提供任何實現。但在Java 8以及以後的版本中,接口是可以有默認實現的。此時,我們定義了一個類,再用該類去實現接口,那麼就必須覆蓋接口中的方法,提供功能實現,從而實現類接口中定義的功能。

類實現接口:一個類可以實現多個接口,從而也彌補了類的單繼承問題。語法如下:

  • [修飾符] class 實現類名 extends 父類 implements 接口1,接口2{}

接口和實現類之間的關係,稱之爲"實現關係",使用implements關鍵字來表示,但有時候爲了方便,也把這個實現關係稱之爲特殊繼承關係。可以這樣理解:接口是實現類的父類:實現類就是接口的子類。

面向接口編程

接口和實現類的多態關係是在開發中比較常見的多態體現

  • 接口 變量 = 創建實現類對象;//體現了多態思想

接口中的方法是公共的抽象的,所以實現類必須覆蓋接口中的方法,並且方法必須使用public修飾,因爲接口中的方法默認就是使用public修飾的。

接口和抽象類的相同點

  1. 都位於繼承的頂端,用於被其他類或者接口實現或繼承;

  2. 都不能被實例化;

  3. 都可以定義抽象方法,其子類/實現類都必須覆寫這些抽象方法;

接口和抽象類的不同點

  1. 接口沒有構造方法,抽象類有構造方法;

  2. 抽象類可包含普通方法和抽象方法,接口只能包含抽象方法(Java 8之前);

  3. 類是單繼承的,一個類只能繼承一個直接父類(可能是抽象類),接口是支持多繼承的;一個可以類實現多個接口(接口彌補了Java的單繼承);

  4. 成員變量:接口裏默認是public static final,抽象類是默認包權限;

  5. 方法:接口裏默認是public abstract,抽象類默認是默認包訪問權限;

  6. 內部類:接口裏默認是public static,抽象類默認是默認包訪問權限;

如果接口和抽象類可以完成相同的功能,儘量使用接口,這就是面向接口編程。面向接口編程在於使用多態的好處,把實現類對象賦給接口類型變量,屏蔽了不同實現類之間的實現差異,從而可以做到通用編程。

案例:使用USB設備來工作。

USB接口及USB實現設備

主板

運行實例

完結。老夫雖不正經,但老夫一身的才華

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