搜尋
首頁Java何時使用抽象,何時使用介面?

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。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用