Java基礎之淺談接口

前言

  • 前幾篇文章我們已經把Java的封裝、繼承、多態學習完了,現在我們開始比較便於我們實際操作的學習,雖然它也是Java基礎部分,但是其實入門容易,精通很難。
  • 我認真的給大家整理了一下這些必須學會、了解的知識點。
    -下面我們正式進入正題吧<( ̄︶ ̄)↗[GO!]

一、接口

1.接口的概念

  • 接口:接口並不是類,而是幫助類去實現功能的一種技術。
  • 如果你的類符合某個特定的接口,我就會履行這項服務。
  • 定義接口我們可以使用interface關鍵字
  • 將類聲明為實現某個接口可以用implements

2.什麼是實例字段

  • 先說字段,什麼是字段?
  • 字段是屬於類的,它是會用public、private等關鍵字修飾的。而變量就是我們通常定義的int a這樣的,它沒有訪問控制符;
  • 所以實例字段就是我們構造器中的,也就可以理解為沒用構造方法。

3.接口的特點

  • 接口中的所有方法都自動是public的,因此在接口中我們可以省略public關鍵字
  • Java中接口不會有實例字段,可以將接口看成沒用實例字段的抽象類。
  • 接口中的字段總是public static final的
  • Java中雖然不能夠多繼承,但是可以用一個類實現多個接口,從而達到了多繼承的效果。(這也是接口和抽象類的概念,雖然接口中在JDK8之前是抽象的,但是抽象類只能被繼承一個,而接口可以被實現多個)
  • 在接口中現在實現了定義方法內容,但是需要用到default、和static關鍵字才可以。
  • 在我們類重寫接口方法時,我們不可以省略public關鍵字

二、接口的實際使用

  • 根據上面接口的特點,現在我們來演示一下,接口到底是怎麼使用的。
public interface InterfaceTest {
    int a = 0;
    public static final int b = 0;//public static final可以省略不寫
    void sum1();
    public abstract void sum2();// public abstract可以省略不寫
    static void test1() {
        System.out.println("static可以實現在接口中定義方法內容,此方法不推薦具體用法可自行學習,這也是Java8的新特性");
    }
    default void test2() {
        System.out.println("default可以實現在接口中定義方法內容,並且此方法沒必要去類中實現");
    }
}
class Test1 implements InterfaceTest{
    @Override
    public void sum1() {
        System.out.println("此方法必須在類中去實現");
    }
    @Override
    public void sum2() {
        System.out.println("此方法必須在類中去實現");
    }
}
  • 接口的屬性:
  1. 接口不是類,所以不可以使用new運算符實例化一個接口。x = new Comparable();❌
  2. 但是我們可以使用接口去聲明一個變量 Comparable x;✔
  3. 我們可以使用接口變量去引用實現了這個接口的類
public static void main(String[] args) {
        InterfaceTest inter = new Test1();//跟多態差不多
        if(inter instanceof InterfaceTest) {//同樣可以使用instanceof判斷,這個肯定為true了
            inter.sum1();
            inter.sum2();
            inter.test2();
        }
    }
  • 實現多接口的寫法:public class Employee extends Person implements Comparable,Collection,...

三、解決默認方法衝突

  • 產生原因:一個類繼承了另一個類的同時,又實現了一個接口,當此接口於父類都擁有相同的方法時,他就會產生衝突,那麼會哪個優先呢?我們來看一下吧
class Father {
    public void sum1() {
        System.out.println("我是父親的sum1");
    }
    public void test2() {
        System.out.println("我是父親的test2");
    }
}
class Son extends Father implements InterfaceTest{
    @Override
    public void sum1() {//在我們重寫方法是不可以省略public
        System.out.println("此方法必須在類中去實現,我是兒子sum1");
    }
    @Override
    public void sum2() {
        System.out.println("此方法必須在類中去實現");
    }

    public static void main(String[] args) {
        InterfaceTest inter = new Son();
        if(inter instanceof InterfaceTest) {
            inter.sum1();//經過測試發現,和多態性一樣,優先調用子類
            inter.sum2();
            inter.test2();//經過測試發現,這個default的情況是,父類優先
        }
    }
}
  • 最終就是記住「類優先」原則。

四、接口回調

  • 如果說父類實現了某個接口,那麼子類繼承父類時候,自然實現了該接口,沒用必要再實現了。
  • 在我剛接觸這個”接口回調“一次時,我覺得非常的高大上。
  • 其實就是簡單的多態應用
  • 假設Com是一個接口,ImpleCom()是該接口的實現類,則Com c = new ImpleCom();
  • 在調用方法是仍然和多態一樣。可以把實現某一接口的類創建的對象的引用賦值給該接口聲明的接口變量—->Com c = new ImpleCom();,那麼該接口變量 c 就可以調用被類實現的接口方法以及接口提供的default方法或者類重寫的default方法。
    其實真沒啥可說的,就是這個 c 既可以調用從接口那裡實現過來的方法,也可以調用自身的方法。

五、結尾

  • 對於接口內容就總結這麼多,希望大家可以多多練習。如果有不足之處,希望大家多多包涵,多多支持。如果有不懂的地方可以直接私信問我,歡迎來訪!
    其實應該還有Lambda表達式,以及內部類的內容,但是這部分在基礎中並不常用,我決定在後面補給大家。
  • 我將會繼續更新關於Java的學習知識,感興趣的小夥伴可以關注一下。
  • 文章寫得比較走心,用了很長時間,絕對不是copy過來的!
  • 尊重每一位學習知識的人,同時也尊重每一位分享知識的人。
  • 😎你的點贊與關注,是我努力前行的無限動力。🤩