Java 中介面和抽象類的區別

Mohammad Irfan 2023年10月12日
  1. 抽象類和介面之間的相似之處
  2. 抽象類和介面的區別
  3. 什麼時候使用抽象類和介面
  4. Java 中的抽象類
  5. Java 中的介面
  6. 實現介面的抽象類
  7. 總結
Java 中介面和抽象類的區別

本教程介紹了 Java 中介面和抽象類之間的區別,並列出了一些示例程式碼來理解該主題。

抽象是隱藏實現並且只向使用者提供基本細節的過程。Java 中的抽象是通過抽象類和介面實現的。抽象類和介面有一些共同點,但它們之間有很大的不同。讓我們先來看看兩者之間的一些相似之處。

抽象類和介面之間的相似之處

  • 如上所述,抽象類和介面都用於抽象。
  • 抽象類和介面無法例項化,即我們無法為它們建立物件。
  • 子類必須覆蓋抽象類或介面中定義的抽象方法。

以上幾點幾乎總結了兩者之間的相似之處。現在讓我們看看它們之間的一些主要區別。

抽象類和介面的區別

抽象類 介面
Java 中的 abstract 關鍵字用於建立或宣告抽象類。 在 Java 中,interface 關鍵字用於建立或宣告新介面。
類可以通過使用 extends 關鍵字來繼承抽象類的屬性和方法。 要在 Java 中實現介面,我們可以使用 implements 關鍵字。
抽象類中可以定義抽象或非抽象方法。抽象方法是沒有為它們提供任何實現的方法。 一個介面中只能有抽象方法。我們只能提供方法定義而不能提供其實現。在 Java 8 之後,我們還可以在介面中使用預設方法和靜態方法。
抽象類可以在其中包含最終或非最終變數(類屬性)。它還可以包含靜態或非靜態屬性。 一個介面只能包含靜態成員和最終成員,不允許有其他型別的成員。
抽象類可以實現介面並實現介面的方法。 介面不能擴充套件任何其他類,也不能覆蓋或實現抽象類方法。
抽象類可以擴充套件其他類,也可以實現介面。 正如前一點所討論的,介面不能擴充套件其他類。但是實現介面沒有限制。
Java 不支援通過類進行多重繼承。抽象類,就像任何其他類一樣,不支援多重繼承。 Java 中的多重繼承支援是通過介面提供的。這是因為介面提供了完整的抽象。
抽象類成員或屬性可以是私有的、受保護的或公共的。 介面的屬性或成員始終是公共的。

什麼時候使用抽象類和介面

抽象類可以提供部分或完全抽象。另一方面,介面總是提供完整的抽象。可以為一些具有一些共同功能的類建立一個抽象父類。如果你想要更多的行動自由,抽象類也是首選。

當我們想要定義一個基本結構時,介面是首選。然後程式設計師可以用這個結構構建任何東西。介面還支援多重繼承。所以單個類可以實現多個介面。

總的來說,這是一個選擇問題和需要完成的任務。抽象類和介面都適用於不同的目的,應該相應地使用。

Java 中的抽象類

讓我們建立一個抽象類並建立擴充套件它的子類以瞭解抽象類及其功能。

abstract class Bell {
  protected String sound;

  Bell() {
    this.sound = "ting";
  }
  // Abstract Method
  abstract public void ring();

  // Non-Abstract Methods
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }

  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}
class SchoolBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
}
class ChruchBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
}
public class AbstractClassDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

輸出:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume
Decreasing Volume

Java 中的介面

讓我們使用介面複製相同的場景。我們不能再在介面中定義非抽象方法。如果類不想要 increaseVolume()decreaseVolume() 方法的公共實現,介面是正確的選擇。

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
class SchoolBell implements Bell {
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of School Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of School Bell");
  }
}
class ChruchBell implements Bell {
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of Chruch Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of Chruch Bell");
  }
}
public class InterfaceDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

輸出:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume of School Bell
Decreasing Volume of Chruch Bell

實現介面的抽象類

如上一節所述,我們可以在抽象類中實現介面的方法。下面的程式碼演示了這一點。

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
abstract class AbstractBell implements Bell {
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }
  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}

總結

抽象是物件導向程式設計中使用的最基本的概念之一。抽象用於隱藏實現,只向使用者提供最少的基本細節。在 Java 中,抽象是通過使用抽象類或介面來完成的。兩者之間的主要區別是抽象類也可以提供部分抽象,而介面將始終提供完整抽象。在本教程中,我們討論了兩者之間的一些主要區別。

相關文章 - Java Interface