首頁  >  文章  >  何時使用抽象,何時使用介面?

何時使用抽象,何時使用介面?

PHPz
PHPz轉載
2024-02-22 12:25:19700瀏覽

php小編子墨帶您探索Java中抽象類別和介面的使用時機。在Java程式設計中,選擇何時使用抽象類別,何時使用介面是一項重要決策。本文將為您解答這個常見的問題,幫助您更能理解在不同情況下如何選擇合適的抽象類別或介面。

問題內容

我隱約明白抽象和介面之間的區別,但我根本無法理解的是,什麼時候使用抽象,什麼時候使用介面。我需要哪些變數來選擇介面抽象,反之亦然?網路上大部分答案都是為了展示差異,但即使我理解它們。不知道什麼時候比較適合。

解決方法

一般古老的原則是:堅持使用接口,直到你被迫寫抽象類別。

java 中的 interface 是一種不可實例化類型,它定義了其他類型可以選擇遵守的公共介面。

  • 介面可以宣告公共方法,這些方法必須由其實作者定義。所有此類方法都隱含為 abstract,因此您不需要使用單字 abstract
  • 在舊版的 java 中,介面不能有預設實現,因此每個方法都是 abstract。現在情況已不再是這樣,介面現在可以具有在 implementing 類別中使用的預設實現,除非被替換。
  • 在最新版本的 java 中,介面可以宣告 private 輔助方法。這些可以幫助實現預設實現。
  • 介面永遠不能有建構子或實例變數。
  • 一個類別可以 implement 多個介面。

abstract 類別 只是一個無法實例化的類別。抽象類別不需要定義任何 abstract 方法,儘管您通常會想要這樣做。

  • 抽象類別可以宣告具有任何可見性的方法:publicprivateprotected 和 package-private。
  • 抽象類別可以實作方法或將它們保留為 abstract。抽象類別中的方法不是隱含 abstract,並且必須如此標記。
  • 抽象類別可以有建構函數,extending 類別必須使用 super 在自己的建構子中呼叫建構子。抽象類別可以具有任何可見性的實例變量,它們的工作方式就像任何父類別中的實例變數一樣。
  • 一個類別只能 extend 一個類,可以是 abstract 類,也可以是具體類別。類別的 abstractness 不會改變它允許擁有的超類別的數量。

abstract classes 應該是例外而不是常態。如果您需要維護某些內部狀態,同時也讓子類別定義您自己的行為,則應該使用抽象類別。一個很好的例子來自 java swing gui 函式庫:AbstractButtonabstractbutton 是行為模糊地類似於視窗中按鈕的事物的抽象父代,包括按鈕、切換按鈕和選單中的項目。任何人都可以子類化 abstractbutton 並實現其成員來定義類似按鈕的顯示。但是 abstractbutton 還必須維護大量內部狀態(其中大部分來自 jcomponent),以便與視窗以及整個 swing api 進行通訊。

如果要為類型集合定義公共接口,請使用 interface。如果您想為其中一些方法提供預設實作並且使用 2014 年之後發布的 java 版本,請使用介面。如果您需要預設實作但仍停留在 2000 年代,請使用抽象類別。無論 java 版本為何,如果您需要私有狀態(例如實例變數)或自訂初始化(例如建構函數),請使用抽象類別。

介面:

假設您有一個介面,例如:

interface animal {
  string makenoise();
}

以及幾個實作 animal 的類別:

class cat implements animal {
    string makenoise() {
        return "meow";
    }
}

class dog implements animal {
    string makenoise() {
        return "woof";
    }
}

現在您可以使用介面作為傳回類型,因此方法可以傳回 catdog

string makeanimalmakenoise(int animalid) {
    animal animal = pretendanimalservice.getdogorcat(animalid);

    animal.makenoise();
}

抽象類別:

假設您有一個抽象類別:

abstract class animal {
    public string makenoise() {
        return "whistle";
    }

    abstract public string getname();
}

現在,任何擴展它的類別都需要實作 getname 方法:

class Cat extends Animal {
    String getName() {
        return "Pussy";
    }
}

class Dog extends Animal {
    String getName() {
        return "Fido";
    }
}

上述兩個類別都實作了所需的 getname 方法,但它們也可以存取父類別 makenoise 方法,如果需要,也可以覆寫該方法。

注意其他差異也很重要,它們是:

  • 您只能擴充一個抽象類,但可以實作多個 接口。
  • 當不同類型應具有相同的方法簽章時,應使用介面;而當實作共用共同行為時,應使用抽象類別。
  • 它們並不互相排斥。
  • 介面只能有公共方法,而抽象類別可以有公共方法和受保護方法。

以上是何時使用抽象,何時使用介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除