Java程式設計那些事兒68 抽象類和介面 一

2021-04-23 18:06:48 字數 2395 閱讀 3243

在實際的專案中,整個專案的**一般可以分為結構**和邏輯的**。就像建造房屋時,需要首先搭建整個房屋的結構,然後再細化房屋相關的其它的結構,也像製造汽車時,需要首先製作汽車的框架,然後才是安裝配件以及美化等工作。程式專案的實現也遵循同樣的道理。

在專案設計時,乙個基本的原則就是——「設計和實現相分離」。也就是說結構**和邏輯**的分離,就像設計汽車時只需要關注汽車的相關引數,而不必過於關心如何實現這些要求的製作。程式設計時也是首先設計專案的結構,而不用過多的關係每個邏輯的**如何進行實現。

前面介紹的流程控制知識,主要解決的是邏輯的**的編寫,而類和物件的知識,則主要解決結構**的編寫。那麼還有乙個主要的問題:如何設計結構**呢?這就需要使用下面介紹的抽象類和介面的知識了。

8.9.1

抽象類

抽象類(abstract class)

是指使用

abstract

關鍵字修飾的類,也就是在宣告乙個類時加入了

abstract

關鍵字。抽象類是一種特殊的類,其它未使用

abstract

關鍵字修飾的類一般稱作實體類。例如:

public abstract class a

}抽象方法

(abstract method)

是指使用

abstract

關鍵字修飾的方法。抽象方法是一種特殊的方法,其它未使用

abstract

關鍵字修飾的方法一般稱作實體方法。

public abstract void test();

抽象類和實體類相比,主要有以下兩點不同: l

抽象類不能使用自身的構造方法建立物件

(語法不允許)

例如下面的語法是錯誤的:

a a = new a();

但是抽象類可以宣告物件,例如下面的**是正確的:

a a;

a a1,a2;

只是宣告出的物件預設都是

null

的,無法呼叫其內部的非靜態屬性和非靜態方法。

說明:抽象類可以使用子類的構造方法建立物件。

l抽象類內部可以包含任意個

(0個、

1個或多個

)抽象方法

抽象類內部可以包含抽象方法,也可以不包含抽象方法,對於包含的個數沒有限制。而實體類內部不能包含抽象方法。

在抽象類內部,可以和實體類一樣,包含構造方法、屬性和實體方法,這點和一般的類一樣。

抽象方法和實體方法相比,主要有以下幾點不同:

l抽象方法沒有方法體

也就是說在宣告抽象方法時,不能書寫方法體的

{},而只能以分號結束方法。下面是實體方法和抽象方法宣告的比較:

抽象方法宣告:

public abstract void test(int a);

實體方法宣告:

publicvoid test(int a)

l抽象方法所在的類必須為抽象類

也就是說,如果抽象方法宣告在乙個類內部,則該類必須為抽象類。

(說明:抽象方法也可以出現在介面內部,這個將在後續進行介紹)。

這樣,在繼承時,如果繼承的類是抽象類,而該抽象類中還包含抽象方法時,則該子類必須宣告成抽象類,否則將出現語法錯誤。如果子類需要做成實體類的話,則必須覆蓋繼承的所有抽象方法。這個是抽象類最核心的語法功能——強制子類覆蓋某些方法。

介紹了這麼多抽象類和抽象方法的知識以後,那麼抽象類有什麼用途呢?

抽象類的用途主要有兩個: l

嚴禁直接建立該類的物件

如果乙個類內部包含的所有方法都是

static

方法,那麼為了避免其它程式設計師誤用,則可以將該類宣告為

abstract

,這樣其它程式設計師只能使用類名

.方法名呼叫對應方法,而不能使用物件名

.方法名進行呼叫。這樣的類例如

api中的

math類

說明:配合

final

關鍵字使用,將必須該類被繼承,這樣將獲得更加完美的效果。 l

強制子類覆蓋抽象方法

這 樣可以使所有的子類在方法宣告上保持一致,在邏輯上也必須將方法的功能保持一致。例如遊戲中設計類時,設計了怪物類以及相關的子類,每個怪物類都有移動方 法,但是每種怪物的移動規則又不相同,這樣通過使每個怪物類的移動方法的宣告保持一致,方便呼叫。可以參看前面多型部分的介紹獲得更多的關於呼叫統一知 識。

這是抽象類最主要的用途。就像現實社會中,各種銀行網點保持統一的裝修風格,各種快餐店

(肯德基、麥當勞等

)保持統一的裝修甚至風味,這樣便於生活中的識別。通過讓存在繼承關係的類中功能一樣

(但是內部實現規則不同

)的方法宣告成一樣的,方便多型的使用。

那麼什麼時候在設計時使用抽象類呢?這個問題參看一下抽象類的用途自然就知道了。關於抽象類的知識先介紹這麼多,下面介紹介面的知識,最終將對抽象類和介面進行一下比較。

抽象類那點事兒

什麼是抽象類?簡單來說,由abstract類修飾的類就是抽象類,如 abstract class 類名,這就組成了抽象類。抽象類的特點 抽象方法 同樣,用abstract修飾的方法就是抽象方法,抽象方法既然是方法,就得遵從方法的共性 被定義在類中,但由於它是抽象的,所以只能定義在抽象類中 抽象方法有...

java程式設計思想 抽象類

一 抽象類 1 什麼是抽象類 對於類的某個方法可以描述這個的某個特性。比如動物的跑等,但是不同的物件可能方法是不一樣的。這就需要對方法進行抽象。這樣就可以根據不同的類的特點,進行繼承,然後再對抽象的方法進行重寫。abstract class abstract void 2 抽象類的特點 1 抽象類不...

java 物件導向程式設計 抽象類

我們在上一章中介紹了什麼是介面,也說到了介面就是一組抽象的資料模型,可以理解為一組協議。但實際上,在物件導向的概念中,有乙個知識點是極容易被人與介面混淆的,人們往往會誤解為這兩者是同乙個概念。但不幸的是,兩者雖然有相似之處,但卻是完全不一樣的概念。那麼,如此神秘的它到底是什麼呢?讓我們揭開它的蓋頭來...