Java面向對象之接口——interface

2020-12-08 老夫編程說
Java面向對象之接口——interface

什麼是接口

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

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

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

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

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

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

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

各有特色的功能機充電器

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

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

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

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

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

Java中的接口

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

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

接口的命名:

表示具有某些能力的,可以以able/handler結尾。如: Walkable.java以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 {}

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

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

接口的特點

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

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

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

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

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

類和接口的實現關係

接口的實現

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

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

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

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

面向接口編程

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

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

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

接口和抽象類的相同點

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

接口沒有構造方法,抽象類有構造方法;抽象類可包含普通方法和抽象方法,接口只能包含抽象方法(Java8之前);類是單繼承的,一個類只能繼承一個直接父類(可能是抽象類),接口是支持多繼承的;一個可以類實現多個接口(接口彌補了Java的單繼承);成員變量:接口裡默認是public static final,抽象類是默認包權限;方法:接口裡默認是public abstract,抽象類默認是默認包訪問權限;內部類:接口裡默認是public static,抽象類默認是默認包訪問權限;如果接口和抽象類可以完成相同的功能,儘量使用接口,這就是面向接口編程。面向接口編程在於使用多態的好處,把實現類對象賦給接口類型變量,屏蔽了不同實現類之間的實現差異,從而可以做到通用編程。

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

USB接口及USB實現設備
主板
運行實例

完結。

相關焦點

  • Java面向對象之:封裝、繼承、多態
    Java面向對象之:封裝、繼承、多態高內聚和低耦合>面向對象的最終目的是要構建強健、安全、高效的項目,也就是要實現項目的高內聚和低耦合:高內聚:把該模塊的內部數據,功能細節隱藏在模塊內部,不允許外界直接幹預;只能通過公開的接口訪問;低耦合:該模塊只需要給外界暴露少量功能方法;模塊之間相互依賴的程度不高;
  • Java之抽象方法的使用與及接口中抽象方法的簡單介紹
    public interface 接口名稱{//接口內容}備註:換成關鍵字interface之後,編譯生成的字節碼文件仍然是:.java-->.class接口中包含的內容有代碼如下:public interface MyInterfaceAbstract {//這是一個抽象方法public abstract void methodAbs();//這也是抽象方法abstract void
  • 必學——Java抽象類、接口、多態
    1、用關鍵字abstract修飾類稱為abstract類(抽象類)abstract class A{ …}abstract類不能用new運算符創建對象,必須產生其子類,由子類創建對象。(1)、接口的聲明與使用接口通過使用關鍵字interface來聲明,格式:interface 接口的名字{}(2)、一個類通過使用關鍵字implements 聲明自己實現一個或多個接口。
  • Java面向對象之final、abstract抽象、和變量生命周期
    Java面向對象之final、abstract抽象、final修飾符final抽象方法修飾符不能是private 和 final以及static,因為抽象方法是要被重寫的;抽象方法必須定義在抽象類或接口中。
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。於是我們同樣創建的動物的對象,同樣調用這個動物對象叫的方法,如果這個動物對象是貓,則會發出「喵喵」聲,而如果這個動物對象是狗,發出的聲音則成了「汪汪」。這就是不同之類之間體現出來的多態。在代碼上體現就是方法名稱,參數,返回值完全與父類相同,而不同的子類在方法體內的代碼邏輯不同。
  • 淺析java繼承與多態,抽象類與接口的區別
    Java 是個純粹的面向對象語言,沒有過程式的寫法,所有操作都是基於對象。面向對象的設計可以更好的解決系統維護、擴展、和代碼重用的需求,代碼過多後過程式的邏輯組織會變得異常複雜,所以就發展出了面向對象式編程。而面向對象的基本特性就是封裝、繼承、與多態。
  • Java @FunctionalInterface註解
    在學習 Lambda 表達式時,我們提到如果接口中只有一個抽象方法(可以包含多個默認方法或多個 static 方法),那麼該接口就是函數式接口。
  • 詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析
    這使得按照對象設計出來的系統結構比較穩定。對象包括屬性 (數據)和行為(方法),對象把數據及方法的具體實現方式一起封裝起來,這使得方法和與之相關的數據不再分離,提高了每個子系統的相對獨立性,從而提高了軟體的可維護性。支持封裝、抽象、繼承和多態等各種特徵,提高了軟體的可重用性、可維護性和可擴展性。
  • 做java的你,這些英文單詞都掌握了嗎?
    9、Casting 類型轉換 :即一個類型到另一個類型的轉換,可以是基本數據類型的轉換,也可以是對象類型的轉換10、Char 字符:容納單字符的一種基本數據類型。11、Child class 子類:見繼承類Derived class12、Class 類:面向對象中的最基本、最重要的定義類型。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    程式語言排行榜目前很多軟體都是用Java寫的,新出的系統和函數庫為了市場,也會儘量和Java兼容或者提供Java的接口零基礎學Java作為一門面向對象的高級語言,Java不僅吸收了C++語言的各種優點,還對C++裡諸如多繼承、指針等一些讓用戶難以理解和掌握的概念重新組織和及摒棄
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    運行時創建對象 方法調用,執行引擎解釋為機器碼 CPU執行指令 多線程切換上下文 編譯 我們都知道,java代碼是運行在Java虛擬機上的。
  • 如何使用JAVA反射/JAVA反射實例
    > c = null ;  // 聲明Class對象  try{   c = Class.forName("com.test.instancedemo.Person") ;  }catch(ClassNotFoundException e){   e.printStackTrace() ;  }  Person per = null ; // 聲明Person對象  try{   per =
  • Java 反射:框架設計的靈魂
    Class clz = Class.forName("java.util.ArrayList");Method method_add = clz.getMethod("add",Object.class);Constructor constructor = clz.getConstructor();Object object
  • 「JAVA」萬字長篇詳述字節碼對象與反射機制完成動態編程
    ,便會啟動JVM,將字節碼文件加載到JVM中,然後開始運行;當運行java命令時,該命令將會啟動一個JVM進程,在這個JVM進程中,會保存有該JVM創建的所有線程、變量、對象,這些線程、變量、對象會共享該JVM的內存區域。
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。而java的多態分為兩種:靜態多態和動態多態。靜態多態的小名叫編譯時多態,通過方法的重載來實現。動態多態是運行時的多態形式,通過對象的多態性質來實現。
  • Unity遊戲開發:C Sharp進階之面向對象編程
    C進階之面向對象編程深入淺出的C#進階課程在了解C#基礎語法之上,進一步學習面向對象(OOP)編程技術和.NET框架,並深入講解在實踐中總結出的OOP設計理念。學完本課程,即可設計出優質的面向對象程序,並可在Unity中用C#來開發所有腳本。
  • 圖說Java中的OOPs(面向對象編程系統)基本概念
    面向對象編程是一種編程概念,其核心思想是允許用戶創建所需要的對象,然後提供處理這些對象的方法,使用者通過操作對象而獲得運算數據。本文將以簡潔的方式對面向對象編程中的概念進行梳理。1.對象既包含數據又包含對數據進行操作的方法。例如,我們日常生活中能夠體現具體物理事物的鋼筆,電腦桌,顯示器,自行車,玻璃杯等等。3. Inheritance(繼承)繼承是Java中的一種機制,它允許其中一個對象獲取父對象的所有屬性和行為(方法)。他是面向對象編程系統(OOPS)的重要組成部分。Java繼承的思想是可以創建基於現有類的新類。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    類中的私有數據在類的外部不能直接使用,外部只能通過類的公共接口方法(函數)來處理類中的數據,從而保證數據的安全。封裝的目的是增強安全性和簡化編程,僅需要通過外部接口,特定的訪問權限來使用類的成員。類設計好以後,就可以實例化該對象。對象形成時,也界定了對象與外界的內外界限。
  • 深入分析java中的多態(從jvm角度分析)
    我們先看一下標準的概念:多態是面向對象程式語言的重要特性,它允許基類的指針或引用指向派生類的對象,而在具體訪問時實現方法的動態綁定(1)Java的方法重載(類內部之間的多態):就是在類中可以創建多個方法,它們具有相同的名字,但可具有不同的參數列表、返回值類型。
  • Java8中你可能不知道的一些地方之Lambda
    很多語言(Groovy、Scala等)從設計之初就支持 Lambda 表達式。但是 java 中使用的是匿名內部類代替。最後藉助強大的社區力量,找了一個折中的 Lambda 實現方案,可以實現簡潔而緊湊的語言結構。一、匿名內部類到Lambda的演化匿名內部類,即一個沒有名字的,存在於一個類或方法內部的類。