Java面向對象之接口——interface


Java面向對象之接口——interface

Java面向對象之接口——interface


什麼是接口

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

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

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

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


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

在如今這個智能機氾濫的年代,不知道大家有沒有懷念當年功能機和山寨機橫行的年代,在那些年代,收件之間的充電設備各個品牌有各個品牌的“特色”,各個品牌均不一樣;如果充電設備丟了,或者損壞了,往往要花費很大的代價才能才能買到新的,所以在當時的萬能充電器才能流行一時,但其充電效果卻並不如人意。

由此帶來的問題極大的困擾了廣大手機用戶。

Java面向對象之接口——interface

各有特色的功能機充電器

直到Android系統的出現,統一了充電接口規範後,這個問題才得到了有效解決。大多數Android手機的充電的接口是相同的( Micro-USB/Type-c/Lightning)。當然了,蘋果手機是個特立獨行的大佬。


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

我們所看到的那些USB插槽是根據USB接口規範設計出來的產品,對於不同型號的USB設備而言,他們各自的USB插槽都需要遵循同一個規範,如此可以保證任何插入USB插槽的設備都能與主板正常通信。對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實現細節;在面向對象的思想中,可認為他們都是同一個類的不同實例,也就是說插槽是USB規範的實例。

Java面向對象之接口——interface

接口和實現類體現了真正的多態


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


Java中的接口


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

<code>定義類語法: 權限修飾符 class 類名{}定義接口語法: 權限修飾符 interface 接口名{}/<code> 

接口的命名:

  1. 表示具有某些能力的,可以以able/handler結尾。如: Walkable.java
  2. 以I開頭表示接口,如:IWalkable.java

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


接口中的成員:

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

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

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

<code>public static final String NAME = "老夫不正經";/<code>

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

<code>public static interface Openable {}/<code>


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

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


接口的特點

  1. 接口沒有構造器,更不能顯式定義構造器,故接口不能被實例化。
  2. 接口裡的方法方法全是抽象公共的,默認修飾符是public abstract。
  3. 接口裡的字段全是全局靜態常量,默認修飾符是public static final。
  4. 接口裡的內部類全是公共靜態的,默認修飾符是public static。


接口的繼承:

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

<code>[修飾符] interface 接口名 extends 接口1,接口2/<code>

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

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


Java面向對象之接口——interface

類和接口的實現關係


接口的實現

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

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

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

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


面向接口編程

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

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

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


接口和抽象類的相同點

  1. 都位於繼承的頂端,用於被其他類或者接口實現或繼承;
  2. 都不能被實例化;
  3. 都可以定義抽象方法,其子類/實現類都必須覆寫這些抽象方法;


接口和抽象類的不同點

  1. 接口沒有構造方法,抽象類有構造方法;
  2. 抽象類可包含普通方法和抽象方法,接口只能包含抽象方法(Java8之前);
  3. 類是單繼承的,一個類只能繼承一個直接父類(可能是抽象類),接口是支持多繼承的;一個可以類實現多個接口(接口彌補了Java的單繼承);
  4. 成員變量:接口裡默認是public static final,抽象類是默認包權限;
  5. 方法:接口裡默認是public abstract,抽象類默認是默認包訪問權限;
  6. 內部類:接口裡默認是public static,抽象類默認是默認包訪問權限;

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


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


Java面向對象之接口——interface

USB接口及USB實現設備

Java面向對象之接口——interface

主板

Java面向對象之接口——interface

運行實例

完結。


分享到:


相關文章: