天天看點

一片文章帶你吃透Java中的【接口-Interface】

文章目錄

  • ​🐳接口​
  • ​​🐯1.1 接口概述​​
  • ​🐶1.2 接口的特點​
  • ​​🦝接口的成員特點 ​​
  • ​​🦄接口與類相似點:​​
  • ​​🐺接口與類的差別:​​
  • ​​🐸接口的功能​​
  • ​​🐲接口的使用:​​
  • ​🐼接口的分類​
  • ​​🐶單方法接口​​
  • ​​🐭辨別接口​​
  • ​​🐮常量接口​​
  • ​​🐻‍❄️接口的繼承​​

🐳接口

在我們的生活中接口随處可見,例如家中的插線接口,網線接口,手機,電腦USB接口等等

一片文章帶你吃透Java中的【接口-Interface】
一片文章帶你吃透Java中的【接口-Interface】
一片文章帶你吃透Java中的【接口-Interface】

🐯1.1 接口概述

接口就是一種公共的規範标椎,隻要符合規範标準,大家都可以通用

java中的接口更多的展現在對行為的抽象

Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口隻有方法的特征沒有方法的實作,是以這些方法可以在不同的地方被不同的類實作,而這些實作可以具有不同的行為(功能)。

兩種含義:

一,Java接口,Java語言中存在的結構,有特定的文法和結構;

二,一個類所具有的方法的特征集合,是一種邏輯上的抽象。

前者叫做“Java接口”,後者叫做“接口”。

一片文章帶你吃透Java中的【接口-Interface】
一片文章帶你吃透Java中的【接口-Interface】
一片文章帶你吃透Java中的【接口-Interface】

🐶1.2 接口的特點

  • 接口用關鍵字interface修飾
public interface 接口名 {}
public interface Jumpping {
 public abstract void jump();
}      
  • 類實作接口用implements表示
public class 類名 implements 接口類 {}
//類和接口之間不能用繼承,這裡采用implements實作的意思,類實作接口
public class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("貓貓跳的高");
    }
}      
  • 接口不能執行個體化

    接口的執行個體化參照多态的方法,通過實作類對象執行個體化,這也叫做接口多态

    多态的形式:具體類多态,抽象類多态,接口多态。

    多态的前提:有繼承或者實作關系;有方法重寫;有父類(類/接口)引用指向(子/實作)類對象

  • 接口實作類

    要麼重寫接口中的所有抽象方法

    要麼是抽象類

public class JumppingDemo {
    public static void main(String[] args) {
        //接口也是抽象類,不能執行個體化,這裡采用多态方法執行個體化
           Jumpping j = new Cat();
           j.jump();
    }
}      

🦝接口的成員特點

  • 成員變量

    隻能是常量

    預設修飾符:public static final

  • 構造方法

    接口沒有構造方法,因為接口主要是對行為進行抽象的,是沒有具體存在一個類如果沒有父類,預設繼承Object類

  • 成員方法

    隻能是抽象方法

    預設修飾符: public abstract

🦄接口與類相似點:

  • 一個接口可以有多個方法。
  • 接口檔案儲存在 .java 結尾的檔案中,檔案名使用接口名。
  • 接口的位元組碼檔案儲存在 .class 結尾的檔案中。
  • 接口相應的位元組碼檔案必須在與包名稱相比對的目錄結構中。

🐺接口與類的差別:

Java接口和Java抽象類最大的一個差別,就在于Java抽象類可以提供某些方法的部分實作,而Java接口不可以,這大概就是Java抽象類唯一的優點吧,但這個優點非常有用。如果向一個抽象類裡加入一個新的具體方法時,那麼它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口裡加入一個新方法,所有實作這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實作這個方法才行,這顯然是Java接口的缺點。

一個抽象類的實作隻能由這個抽象類的子類給出,也就是說,這個實作處在抽象類所定義出的繼承的等級結構中,而由于Java語言的單繼承性,是以抽象類作為類型定義工具的效能大打折扣。在這一點上,Java接口的優勢就出來了,任何一個實作了一個Java接口所規定的方法的類都可以具有這個接口的類型,而一個類可以實作任意多個Java接口,進而這個類就有了多種類型。

在文法上,抽象類和接口有着以下不同:

1.abstract class在Java語言中表示的是一種繼承關系,一個類隻能使用一次繼承關系。但是,一個類卻可以實作多個interface。 繼承抽象類使用的是extends關鍵字,實作接口使用的是implements關鍵字,繼承寫在前面,實作接口寫在後面。如果實作多個接口,中間用逗号分隔。例:
public class Main extends JApplet
public class Main implements Runnable
public class Main extends JApplet implements ActionListener      

2.在abstract class中可以有自己的資料成員,也可以有非abstract的成員方法,而在interface中,隻能夠有靜态的不能被修改的資料成員(也就是必須是static final的,不過在 interface中一般不定義資料成員),所有的成員方法都是abstract的。

3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。

4.實作接口的類必須實作其中的所有方法,繼承自抽象類的子類實作所有的抽象方法。抽象類中可以有非抽象方法。接口中則不能有實作方法。

5.接口中定義的變量預設是public static final 型,且必須給其初值,是以實作類中不能重新定義,也不能改變其值。

6.抽象類中的變量預設具有 friendly權限,其值可以在子類中重新定義,也可以重新指派。

7.接口中的方法預設都是 public abstract 類型的。

總的來說有以下幾點

  • 🐲接口不能用于執行個體化對象。 接口沒有構造方法。
  • 🐲接口中所有的方法必須是抽象方法,
  • 🐲Java 8 之後 接口中可以使用 default關鍵字修飾的非抽象方法。
  • 🐲接口不能包含成員變量,除了 static 和 final 變量。
  • 🐲接口不是被類繼承了,而是要被類實作。
  • 🐲接口支援多繼承。

🐸接口的功能

在Java語言規範中,一個方法的特征僅包括方法的名字、參數的數目和類型,而不包括方法的傳回類型、參數名以及所抛出來的異常。在Java編譯器檢查方法的重載時,會根據這些條件判斷兩個方法是否是重載方法。但在Java編譯器檢查方法的置換時,則會進一步檢查兩個方法(分處超類型和子類型)的返還類型和抛出的異常是否相同。

接口實作和類繼承的規則不同,為了資料的安全,繼承時一個類隻有一個直接父類,也就是單繼承,但是一個類可以實作多個接口,接口彌補了類的不能多繼承缺點,繼承和接口的雙重設計既保持了類的資料安全也變相實作了多繼承。

Java接口本身沒有任何實作,因為Java接口不涉及表象,而隻描述public行為,是以Java接口比Java抽象類更抽象化。但是接口不是類,不能使用new 運算符執行個體化一個接口。如 x=new comparable(…);//這個是錯誤來的。但是可以聲明接口變量Comparable x; //這是允許的。

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

接口把方法的特征和方法的實作分割開來。這種分割展現在接口常常代表一個角色,它包裝與該角色相關的操作和屬性,而實作這個接口的類便是扮演這個角色的演員。一個角色由不同的演員來演,而不同的演員之間除了扮演一個共同的角色之外,并不要求其它的共同之處。

🐲接口的使用:

兩個類中的兩個類似的功能,調用他們的類動态的決定一種實作,那他們提供一個抽象父類,子類分别實作父類所定義的方法。

問題的出現:Java是一種單繼承的語言,一般情況下,哪個具體類可能已經有了一個超類,解決是給它的父類加父類,或者給它父類的父類加父類,直到移動到類等級結構的最頂端。這樣一來,對一個具體類的可插入性的設計,就變成了對整個等級結構中所有類的修改。

可插入性

在一個等級結構中的任何一個類都可以實作一個接口,這個接口會影響到此類的所有子類,但不會影響到此類的任何超類。此類将不得不實作這個接口所規定的方法,而其子類可以從此類自動繼承這些方法,當然也可以選擇置換掉所有的這些方法,或者其中的某一些方法,這時候,這些子類具有了可插入性(并且可以用這個接口類型裝載,傳遞實作了他的所有子類)。

我們關心的不是那一個具體的類,而是這個類是否實作了我們需要的接口。

接口提供了關聯以及方法調用上的可插入性,軟體系統的規模越大,生命周期越長,接口使得軟體系統的靈活性和可擴充性,可插入性方面得到保證。

類型

使用Java接口将軟體機關與内部和外部耦合起來。使用Java接口不是具體的類進行變量的類型聲明,方法的返還類型聲明,參量的類型聲明,以及資料類型的轉換。

在理想的情況下,一個具體的Java類應當隻實作Java接口和抽象Java類中聲明的方法,而不應當給多餘方法。

等級結構

Java接口(以及抽象類)一般用來作為一個類型的等級結構的起點。

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

一片文章帶你吃透Java中的【接口-Interface】

🐼接口的分類

🐶單方法接口

public interface Actionlistener{
public abstract void actionPerformed(ActionEvent event);
}      

僅且隻有一個方法,隻有實作了這個接口(重寫這個接口中的唯一一個方法),你才有資格去事件監聽器清單裡注冊(參數為Actionlistener類型),當事件源變動時,自動調用這個唯一的actionPerformed方法。

🐭辨別接口

是沒有任何方法和屬性的接口。辨別接口不對實作它的類有任何語意上的要求,它僅僅表明了實作它的類屬于一個特定的類型(傳遞)。

🐮常量接口

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

定義接口格式:

[public]interface 接口名稱 [extends父接口名清單]
{
//靜态常量
[public] [static] [final] 資料類型變量名=常量值;
//抽象方法
[public] [abstract] [native] 傳回值類型方法名(參數清單);
}      

實作接口格式:

[修飾符] class 類名[extends 父類名] [implements 接口A,接口B,···]
{
類成員變量和成員方法;
為接口A中的所有方法編寫方法體,實作接口A;
為接口B中的所有方法編寫方法體,實作接口B;
}      

示例:

建立一個接口

public interface Interface {
    public int num =10;//有成員變量
    public final int num2 = 20;//也可以是常量
}      

建立測試類

/*
   測試類
 */
public class InterfaceDemo {
    public static void main(String[] args) {
        Interface i = new InterImpl();//多态方法
        //接口中的成員變量預設被final修飾,接口裡面沒有成員變量,預設為常量,且被靜态修飾
        System.out.println(i.num);
        System.out.println(i.num2);
        System.out.println(Interface.num);//可以通過接口名直接通路
    }
}      

建立一個類實作接口

//接口名後面加一個Impl表示接口的實作類
public class InterImpl implements Interface{
}      

🐻‍❄️接口的繼承

一個接口能繼承另一個接口,和類之間的繼承方式比較相似。接口的繼承使用extends關鍵字,子接口繼承父接口的方法。

接口的多繼承

在Java中,類的多繼承是不合法,但接口允許多繼承。

标記接口

最常用的繼承接口是沒有包含任何方法的接口。

标記接口是沒有任何方法和屬性的接口.它僅僅表明它的類屬于一個特定的類型,供其他代碼來測試允許做一些事情。

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

沒有任何方法的接口被稱為标記接口。标記接口主要用于以下兩種目的:

建立一個公共的父接口:

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

向一個類添加資料類型:

這種情況是标記接口最初的目的,實作标記接口的類不需要定義任何接口方法(因為标記接口根本就沒有方法),但是該類通過多态性變成一個接口類型。