抽像類與接口:異同

已發表: 2021-06-02

如果您正在參加軟件工程面試,您可能會遇到的一個問題是 – 抽像類和接口之間的差異和相似之處。

抽像類和接口是面向對象編程的基本塊。 這兩者都使程序員能夠實現 OOP 中更重要的概念之一——抽象。 雖然抽像類和接口都用於實現抽象的概念,但兩者的實現方式不同,用例也不同。 抽像類和接口可能看起來像初學者,但它們不能互換使用。

在本文中,我們將研究抽像類、接口的細微差別,以及兩者之間的異同。 請記住,抽像類和接口只是一個概念,可以在您選擇的任何面向對象編程語言中實現。 為了保持一致,我們在本文中使用的任何語法來向您解釋這些概念都將是 Java 的。

在本文結束時,您可以清楚地區分抽像類和接口,以及針對特定情況實現哪些。

目錄

接口——它們是什麼?

OOP 中的接口可以簡單地理解為各種系統之間的行為契約。 這意味著任何實現接口的類都必須為接口的所有方法提供某種實現。

接口中的所有方法都必須是公共的和抽象的。 因此,接口也被理解為“純抽象”類。

接口的定義如下所示:

公共接口吃{

公共無效咀嚼();

公共無效消化();

}

如您所見,該定義包括在名稱前加上關鍵字interface 此外,在該接口下定義了兩個抽象公共方法——因此,實現上述接口的類需要提供chewing() 和digesting() 的實現; 職能。

現在讓我們看看抽像類是什麼,然後我們將把這兩個概念放在一起,以便您更清楚地了解它們的異同。

抽像類——它們是什麼?

abstract關鍵字總是在其聲明中作為抽像類的前綴 此外,抽像類充當為其派生的非抽像類創建的指南。 從這個意義上說,它們的聲明中必須至少有一個抽象方法,同時還為其非抽象方法提供正確的實現。

抽像類的定義如下所示:

公共抽像類吃{

公共無效getReady(){

System.out.println(“我準備吃東西了”);

}

公共抽象無效開始();

公共抽象無效停止();

}

正如您在抽像類的定義中看到的, getReady()函數是一個非抽象函數,而start(); 停止(); 函數是抽象的。

在實現抽像類時,您應該注意一些規則:

  • 抽像類不能被實例化。 這意味著——我們不能從任何抽像類創建對象。
  • 任何將擴展抽像類的子類都需要實現抽像類中描述的所有抽象方法。 如果子類沒有實現所有抽象方法,子類也應該聲明為抽像類。

現在我們已經了解了接口和抽像類的基礎知識,讓我們來談談它們有何不同、相似之處以及何時應該使用哪種方法。

接口與抽像類的異同

在接口中聲明的所有方法都是隱式的公共和抽象的——而抽像類可以有各種修飾符來修飾它們的方法——包括部分的、公共的、靜態的、受保護的等等。

此外,任何用戶定義的類都可以實現多個接口。 但是,它們只能實現一個抽像類。 接口和抽像類都可以有方法和變量,但它們都不能被實例化。 接口中聲明的所有變量都是最終的。 但是,抽像類中聲明的變量可以是非最終的,並且可以由用戶定義的類進行修改。

這是抽像類和接口之間所有主要區別的摘要。

範圍抽像類接口
關鍵詞使用了抽象關鍵字。 使用了interface關鍵字。
變量類型可以處理最終、非最終、靜態和非靜態變量。 默認情況下只能定義靜態和最終變量。
最終變量可能會或可能不會在其中聲明最終變量。 默認情況下,變量被聲明為 final
訪問修飾符可以有所有的修飾符——私有的、公共的、靜態的等等。 只能有公共訪問修飾符。
方法類型可以有抽象方法和非抽象方法。 只能有抽象方法。
速度快速地慢,因為它需要額外的間接性。

抽像類與接口:何時選擇哪個?

如果你需要一個基類來在你的代碼中提供一些實現——一個抽像類就是你要走的路。 例如,您可能希望在一個類中初始化一些變量,以便在所有派生類都可以使用的方法中執行一些邏輯操作。 在這種情況下,使用抽像類是最好的選擇。

但是,如果您需要為您的類提供任何附加行為,那麼您應該選擇接口。 實際上,接口和抽像類都將為您提供相同的功能。 但是,當您考慮編碼標準時,差異就出現了。 接口幫助您實現抽象和多態——OOP 的兩個重要原則。 它還允許您保持代碼鬆散耦合而不是緊密耦合。

現在讓我們總結一下接​​口和抽像類的用例!

何時使用接口?

接口允許程序員為他們的類構建額外的行為模式。 它允許某人從頭開始並在他們想要的任何類中實現接口。 因此,接口的目的是附帶的——必須添加到代碼中的東西。 因此,如果您希望為類提供額外的功能並且不介意公開接口的方法(因為所有方法都是公共的),您應該繼續使用接口實現。

何時使用抽像類?

與接口相比,抽像類提供了更多的結構。 抽像類帶有一些方法的默認實現,甚至提供了用於完全實現抽像類的有用工具。 您應該使用抽像類在一組相關類中提供一些通用功能,同時為默認方法實現留出足夠的空間。

從世界頂級大學在線學習軟件開發課程獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。

綜上所述

抽像是 OOP 的重要組成部分,抽像類和接口都允許您在代碼中實現某種程度的抽象。 但是,在不知道優缺點的情況下互換使用它們是錯誤的,並且可能導致您的代碼(以及最終您的軟件)出現錯誤和滯後。

我們希望本文能幫助您了解抽像類和接口之間的關鍵區別,以及一些語法知識以及它們的實現位置。

如果您有興趣了解有關抽像類和接口的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發執行 PG 計劃,該計劃專為工作專業人士設計,提供 500 多個小時的嚴格培訓、9 個以上的項目和作業, IIIT-B 校友身份,實用的實踐頂點項目和頂級公司的工作協助。

如果您仍然對細微差別感到困惑,請在下方給我們留言,我們會盡快回复您!

Java中的抽像類是什麼?

抽像類是不能實例化的類,也不能被繼承。 它本身沒有重要的操作,僅充當具體類的超類。 它僅用於提供專業化。 考慮 Car 類及其子類跑車和掀背車的示例。 抽像類 Car 可以被認為是所有子類的父類。

何時在 Java 中使用抽像類?

抽像類的主要目的是為一組相似的類提供基類。 所有擴展抽像類的類都必須實現其抽像類中定義的方法。 抽像類主要用於定義該類期望實現的特定接口。 抽像類可以用作超類,我們可以在其中定義方法,所需的方法可以在子類中實現並可以被子類繼承。 使用抽像類,我們可以定義子類可以使用的通用代碼,從而提高效率。

Java中的抽像類和接口有什麼區別?

抽像類和接口是定義類的兩種方式,其中包含一些但不是所有類要實現的方法。 這兩者在靜態上是不同的,實現方式也不同。 但就動態使用而言,它們是相同的。 接口只是一個只包含常量和抽象方法聲明的類。 Java中沒有接口的實際實現。 所以接口是完全虛擬的類。 接口用於定義類中方法和常量的契約。 它將強制類實現相同的方法和常量。 該方法可以在抽像類或子類中實現。 抽像類是包含抽象方法的類。 子類實現了這些抽象方法。 抽像類和接口可以一起使用來執行類中的某些契約。