php小編子墨帶您探索Java中抽象類別和介面的使用時機。在Java程式設計中,選擇何時使用抽象類別,何時使用介面是一項重要決策。本文將為您解答這個常見的問題,幫助您更能理解在不同情況下如何選擇合適的抽象類別或介面。
問題內容
我隱約明白抽象和介面之間的區別,但我根本無法理解的是,什麼時候使用抽象,什麼時候使用介面。我需要哪些變數來選擇介面抽象,反之亦然?網路上大部分答案都是為了展示差異,但即使我理解它們。不知道什麼時候比較適合。
解決方法
一般古老的原則是:堅持使用接口,直到你被迫寫抽象類別。
java 中的 interface
是一種不可實例化類型,它定義了其他類型可以選擇遵守的公共介面。
- 介面可以宣告公共方法,這些方法必須由其實作者定義。所有此類方法都隱含為
abstract
,因此您不需要使用單字abstract
。 - 在舊版的 java 中,介面不能有預設實現,因此每個方法都是
abstract
。現在情況已不再是這樣,介面現在可以具有在implement
ing 類別中使用的預設實現,除非被替換。 - 在最新版本的 java 中,介面可以宣告
private
輔助方法。這些可以幫助實現預設實現。 - 介面永遠不能有建構子或實例變數。
- 一個類別可以
implement
多個介面。
abstract 類別
只是一個無法實例化的類別。抽象類別不需要定義任何 abstract
方法,儘管您通常會想要這樣做。
- 抽象類別可以宣告具有任何可見性的方法:
public
、private
、protected
和 package-private。 - 抽象類別可以實作方法或將它們保留為
abstract
。抽象類別中的方法不是隱含abstract
,並且必須如此標記。 - 抽象類別可以有建構函數,
extend
ing 類別必須使用super
在自己的建構子中呼叫建構子。抽象類別可以具有任何可見性的實例變量,它們的工作方式就像任何父類別中的實例變數一樣。 - 一個類別只能
extend
一個類,可以是abstract
類,也可以是具體類別。類別的abstract
ness 不會改變它允許擁有的超類別的數量。
abstract class
es 應該是例外而不是常態。如果您需要維護某些內部狀態,同時也讓子類別定義您自己的行為,則應該使用抽象類別。一個很好的例子來自 java swing gui 函式庫:AbstractButton
。 abstractbutton
是行為模糊地類似於視窗中按鈕的事物的抽象父代,包括按鈕、切換按鈕和選單中的項目。任何人都可以子類化 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"; } }
現在您可以使用介面作為傳回類型,因此方法可以傳回 cat
或 dog
。
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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

記事本++7.3.1
好用且免費的程式碼編輯器

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用