簡體   English   中英

使用沒有任何抽象方法的抽象類

[英]Use of an abstract class without any abstract methods

抽象類不需要包含任何抽象方法。

除了抽象類無法實例化這一事實之外,還有其他原因使類抽象化嗎?

抽象類意味着類的定義不完整 ,因此無法實例化。 盡管它沒有抽象方法,但它表明該類可用於繼承 盡管它具有其中所有方法的實現,但實現可能仍然不完整,並且必須由擴展類覆蓋。

即使您不想實現該類實現的所有接口方法,也可以將類設為抽象類。 根據java 文檔

有人指出,實現接口的類必須實現所有接口的方法。 但是,如果聲明該類是抽象的,則可以定義一個不實現所有接口方法的類。

無論如何你都無法實例化一個用abstract聲明的類。

可能不是。 它會阻止“靜態助手”類被實例化,但我認為使用它會是一種糟糕的風格。

正如其他人所說,如果它打算成為一個基類 - 后代聲明和實現接口/功能,這對超類來說太具體了 - 那么abstract可能適合超類。

在這種情況下,它是一個聲明,超級對它自己沒用,並且子類將做更多的事情 - 他們將特別聲明。

抽象類的主要作用是提供一個適當的根類,從中可以派生出具體的(即非抽象的)子類。 這是一個功能強大且功能多樣的功能,可以促進代碼重用。 抽象類封裝了一系列數據類型通用的一般特性 - 這些特性在抽象類中過於籠統而無意義,但可以在子類中重寫

任何具有抽象方法的類本身都是自動抽象的,並且必須使用關鍵字abstract定義自己 - 有趣的是,抽象類不需要包含任何抽象方法

抽象類無法實例化 - 換句話說,您無法創建抽象類的實例(對象)

即使抽象類的對象無法實例化,也可以聲明對抽象類對象的引用,例如Account a; 不會生成語法錯誤

如果抽象類的子類重寫,即在其超類中提供每個抽象方法的實現,則子類稱為具體類,並且可以創建子類的對象

如果抽象類的子類沒有覆蓋(實現)它繼承的所有抽象方法,那么該子類本身也是抽象的,必須聲明為

非抽象類中不能有抽象函數!

因此,如果您因為某種原因需要在類中使用抽象函數,則必須將您的類聲明為抽象類。

為什么我需要一個抽象函數?

使用抽象方法有什么意義?

如果抽象類可能不包含任何抽象方法。 除了抽象類之外,沒有任何其他理由使類抽象無法實例化

至於你的問題,我能想到的情況如下 -

讓我們說你需要的只是一個類的靜態功能。 靜態變量和函數。 所以基本上你不希望用戶創建你的類的任何實例。 現在你可以將你的構造函數設為私有,從而排除創建它的實例的可能性,但你也不想這樣做。 為什么要寫額外的代碼行? 在這種情況下,您可以使您的類抽象化。

我從下面提取了以下幾點我為什么要將一個類聲明為一個抽象類?

  1. 抽象類通過阻止開發人員實例化基類來改善這種情況,因為開發人員已將其標記為缺少功能。

  2. 它還提供編譯時安全性,以便您可以確保擴展抽象類的任何類提供最低限度的工作功能,並且您不必擔心將繼承者以某種方式必須神奇地知道它們具有的存根方法覆蓋方法以使其工作。

抽象類充當其子類的模板。 例如,抽象類Tree和子類Banyan_Tree具有樹的所有特征以及特定於banyan樹的特征。

理解抽象類和接口之間的差異至關重要。 接口只有方法聲明或抽象方法和常量數據成員,而抽象類可能有抽象方法,成員變量和具體方法。 因為Java僅支持單繼承,所以類可以實現多個接口,但只能擴展一個抽象類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM