1. 程式人生 > 其它 >Java 中介面和抽象類的 7 大區別!

Java 中介面和抽象類的 7 大區別!

本文已收錄《Java常見面試題》:https://gitee.com/mydb/interview

Java 是一門面向物件的程式語言,面向物件的程式語言有四大特徵:抽象、封裝、繼承和多型。
而本文介紹的介面和抽象類就是面向物件程式設計中“抽象”的具體實現,也就是說介面和抽象類都是用來定義實體類的公共行為的,它們是對實體類(物件)更高層次的抽象。

說明:本文以下內容基於 JDK 8 版本。

介面

介面是 Java 語言中的一個抽象型別,用於定義物件的公共行為。它的建立關鍵字是 interface,在介面的實現中可以定義方法和常量,其普通方法是不能有具體的程式碼實現的,而在 JDK 8 之後,介面中可以建立 static 和 default 方法了,並且這兩種方法可以有預設的方法實現,如下程式碼所示:

public interface Interface_1 {
    int count = 1;
    void sayHi();
    // default 方法
    default void print() {
        System.out.println("Do print method.");
    }
    // static 方法
    static void smethod() {
        System.out.println("Do static method.");
    }
}

接下來,建立一個類來實現以上介面:

public class InterfaceImpl_1 implements Interface_1 {
    @Override
    public void sayHi() {
        System.out.println("Hi,I am InterfaceImpl 1.");
    }
    public static void main(String[] args) {
        InterfaceImpl_1 inter = new InterfaceImpl_1();
        inter.sayHi();
        // 呼叫介面中 static 方法
        InterfaceExample.smethod();
        // 呼叫介面中的常量 count
        System.out.println(InterfaceExample.count);
    }
}

以上程式的執行結果如下:

通過上述程式碼和執行結果我們可以得出以下結論:

  1. JDK 8 中介面可以定義 static 和 default 方法,並且這兩種方法可以包含具體的程式碼實現。
  2. 實現介面要使用 implements 關鍵字。
  3. 介面不能直接例項化。
  4. 介面中定義的變數預設為 public static final 型別。
  5. 子類可以不重寫介面中的 static 和 default 方法,不重寫的情況下,預設呼叫的是介面的方法實現。

抽象類

抽象類和介面類似,它也是用來定義物件的公共行為的,並且它也不能直接例項化,抽象類的實現關鍵字為 abstract class,子類用 extends 關鍵字繼承父類。
抽象類的使用如下:

public abstract class AbstractExample {
    // 定義普通變數
    int count = 2;
    // 定義私有變數
    private static int total = 10;
    // 定義抽象方法
    public abstract void methodA();
    // 定義普通方法
    public void methodB() {
        System.out.println("Hi,methodB.");
    }
}

接下來使用一個普通類繼承上面的抽象類:

public class AbstractSon extends AbstractExample {
    @Override
    public void methodA() {
        System.out.println("Hi,method A.");
    }
    public static void main(String[] args) {
        AbstractSon abs = new AbstractSon();
        // 抽象類中的變數重新賦值
        abs.count = 666;
        System.out.println(abs.count);
        // 抽象類中的抽象方法
        abs.methodA();
        // 抽象類中的普通方法
        abs.methodB();
    }
}

以上程式的執行結果如下:

通過上述程式碼和執行結果可以得出以下結論:

  1. 抽象類使用 abstract 關鍵字宣告。
  2. 抽象類中可以包含普通方法和抽象方法,抽象方法不能有具體的程式碼實現。
  3. 抽象類需要使用 extends 關鍵字實現繼承。
  4. 抽象類不能直接例項化。
  5. 抽象類中屬性控制符無限制,可以定義 private 型別的屬性。

介面和抽象類的區別主要體現在以下 7 個方面。

區別1:定義關鍵字不同

介面使用關鍵字 interface 來定義。
抽象類使用關鍵字 abstract 來定義。

區別2:繼承或實現的關鍵字不同

介面使用 implements 關鍵字定義其具體實現。
抽象類使用 extends 關鍵字實現繼承。

區別3:子類擴充套件的數量不同

介面的實現類可以有多個,如下圖所示:

而抽象類的子類,只能繼承一個抽象類,如下圖所示,繼承多個抽象類就會報錯:

在 Java 語言中,一個類只能繼承一個父類(單繼承),但可以實現多個介面。

區別4:屬性訪問控制符不同

介面中屬性的訪問控制符只能是 public,如下圖所示:

介面中的屬性預設是 public static final 修飾的。

抽象類中的屬性訪問控制符無限制,可為任意控制符,如下圖所示:

區別5:方法控制符不同

介面中方法的預設控制符是 public,並且不能定義為其他控制符,如下圖所示:

抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,如下程式碼所示:

區別6:方法實現不同

介面中普通方法不能有具體的方法實現,在 JDK 8 之後 static 和 default 方法必須有方法實現,如下程式碼所示:

從上述結果可以看出:static 或 default 方法如果沒有方法實現就會報錯,而普通方法如果有方法實現就會報錯。

抽象類中普通方法可以有方法實現,抽象方法不能有方法實現,如下程式碼所示:

從上述結果可以看出:抽象類中的普通方法如果沒有方法實現就會報錯,而抽象方法如果有方法實現則會報錯。

區別7:靜態程式碼塊使用不同

介面中不能使用靜態程式碼塊,如下程式碼所示:

抽象類中可以使用靜態程式碼塊,如下程式碼所示:

總結

介面和抽象類都是用來定義物件的公共行為的,但二者有以下 7 點不同:

  1. 定義的關鍵字不同。
  2. 子類繼承或實現關鍵字不同。
  3. 型別擴充套件不同:抽象類是單繼承,而介面是多繼承。
  4. 方法訪問控制符:抽象類無限制,只是抽象類中的抽象方法不能被 private 修飾;而介面有限制,介面預設的是 public 控制符。
  5. 屬性方法控制符:抽象類無限制,而介面有限制,介面預設的是 public 控制符。
  6. 方法實現不同:抽象類中的普通方法必須有實現,抽象方法必須沒有實現;而介面中普通方法不能有實現,但在 JDK 8 中的 static 和 defualt 方法必須有實現。
  7. 靜態程式碼塊的使用不同:抽象類可以有靜態程式碼塊,而介面不能有。

你還知道哪些介面和抽象類的不同?歡迎評論區留言補充。

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java面試真題解析

關注下面二維碼,訂閱更多精彩內容。

關注公眾號(加好友):


作者: 王磊的部落格
出處: http://vipstone.cnblogs.com/