Java基礎之淺談介面

漁夫會扎蛙發表於2022-04-04

前言

  • 前幾篇文章我們已經把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過來的!
  • 尊重每一位學習知識的人,同時也尊重每一位分享知識的人。
  • ?你的點贊與關注,是我努力前行的無限動力。?

相關文章