摘要:抽象類是對整個類整體進行抽象,包括屬性行為,但是接口卻是對類局部行為進行抽象。因此最好的解決辦法是多帶帶將報警設(shè)計為一個接口,包含行為設(shè)計為多帶帶的一個抽象類,包含和兩種行為。
抽象類和接口的區(qū)別
1.語法層面上的區(qū)別
1)抽象類可以提供成員方法的實現(xiàn)細(xì)節(jié),而接口中只能存在public abstract 方法;
2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;
4)一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。
2.設(shè)計層面上的區(qū)別
1)抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共性,就是都會飛。那么在設(shè)計的時候,可以將飛機設(shè)計為一個類Airplane,將鳥設(shè)計為一個類Bird,但是不能將 飛行 這個特性也設(shè)計為類,因此它只是一個行為特性,并不是對一類事物的抽象描述。此時可以將 飛行 設(shè)計為一個接口Fly,包含方法fly( ),然后Airplane和Bird分別根據(jù)自己的需要實現(xiàn)Fly這個接口。然后至于有不同種類的飛機,比如戰(zhàn)斗機、民用飛機等直接繼承Airplane即可,對于鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這里可以看出,繼承是一個 "是不是"的關(guān)系,而 接口 實現(xiàn)則是 "有沒有"的關(guān)系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實現(xiàn)則是有沒有、具備不具備的關(guān)系,比如鳥是否能飛(或者是否具備飛行這個特點),能飛行則可以實現(xiàn)這個接口,不能飛行就不實現(xiàn)這個接口。
2)設(shè)計層面不同,抽象類作為很多子類的父類,它是一種模板式設(shè)計。而接口是一種行為規(guī)范,它是一種輻射式設(shè)計。什么是模板式設(shè)計?最簡單例子,大家都用過ppt里面的模板,如果用模板A設(shè)計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動。而輻射式設(shè)計,比如某個電梯都裝了某種報警器,一旦要更新報警器,就必須全部更新。也就是說對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現(xiàn),子類可以不進行變更;而對于接口則不行,如果接口進行了變更,則所有實現(xiàn)這個接口的類都必須進行相應(yīng)的改動。
下面看一個網(wǎng)上流傳最廣泛的例子:門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:
abstract class Door {
public abstract void open(); public abstract void close();
}
或者:
interface Door {
public abstract void open(); public abstract void close();
}
但是現(xiàn)在如果我們需要門具有報警alarm( )的功能,那么該如何實現(xiàn)?下面提供兩種思路:
1)將這三個功能都放在抽象類里面,但是這樣一來所有繼承于這個抽象類的子類都具備了報警功能,但是有的門并不一定具備報警功能;
2)將這三個功能都放在接口里面,需要用到報警功能的類就需要實現(xiàn)這個接口中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災(zāi)報警器。
從這里可以看出, Door的open() 、close()和alarm()根本就屬于兩個不同范疇內(nèi)的行為,open()和close()屬于門本身固有的行為特性,而alarm()屬于延伸的附加行為。因此最好的解決辦法是多帶帶將報警設(shè)計為一個接口,包含alarm()行為,Door設(shè)計為多帶帶的一個抽象類,包含open和close兩種行為。再設(shè)計一個報警門繼承Door類和實現(xiàn)Alarm接口。
interface Alram {
void alarm();
}
abstract class Door {
void open(); void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() { //.... } void close() { //.... } void alarm() { //.... }
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/76490.html
摘要:抽象方法沒有方法體抽象方法權(quán)限修飾符不能為抽象方法的目的就是為了讓子類繼承重寫的,所以抽象方法不能私有,不能修飾。另外,添加默認(rèn)方法不會影響函數(shù)式接口的使用。 原文:抽象類和接口的區(qū)別已經(jīng)變了 隨著JDK的不斷迭代,抽象類和接口的區(qū)別已經(jīng)有了些許改變,你是否還停留在JDK 7 的答案呢? 定義 抽象類定義通過 abstract class public abstract class A...
摘要:本文中,作者通過多個方面深入剖析抽象類和接口的區(qū)別,并結(jié)合經(jīng)驗供讀者借鑒學(xué)習(xí),本文系工程師編譯整理。在開發(fā)人員崗位面試時,是否了解抽象類和接口之間的基本區(qū)別是一個很重要的考量因素。 【編者按】本文作者是Sebastian Malaca,是面向?qū)ο缶幊痰目駸嵴?,不斷深化研究整潔代碼和高代碼質(zhì)量。本文中,作者通過多個方面深入剖析抽象類和接口的區(qū)別,并結(jié)合經(jīng)驗供讀者借鑒學(xué)習(xí),本文系 OneA...
摘要:如果一個非抽象類遵循了某個接口,就必須實現(xiàn)該接口中的所有方法。抽象類是對整個類整體進行抽象,包括屬性行為,但是接口卻是對類局部行為進行抽象。因此最好的解決辦法是單獨將報警設(shè)計為一個接口,包含行為設(shè)計為單獨的一個抽象類,包含和兩種行為。 一、抽象類 二、接口 三、抽象類和接口的區(qū)別 一、抽象類 在了解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現(xiàn)...
摘要:很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。在討論它們之間的不同點之前,我們先看看抽象類接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的。 很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。本文我們將仔細(xì)討論這些話題。 在討論它們之間的不同點之前,我們先看看抽象類...
摘要:在設(shè)計模式中,抽象類不能夠被實例化初始化,但是可以依靠具體類的繼承來實現(xiàn)。對于大型項目來說,對象都是由基本的抽象類繼承實現(xiàn),而這些類的方法通常都由接口來定義。 原文地址:PHP設(shè)計模式(二):抽象類和接口 Introduction 對于編程來說,對事物的抽象是一個老生常談的話題,抽象問題更利于面向?qū)ο缶幊桃约俺绦蛟O(shè)計模式。和C/C++,Java,Python等語言一樣,PHP也支持面向...
閱讀 1128·2021-09-13 10:29
閱讀 3447·2019-08-29 18:31
閱讀 2717·2019-08-29 11:15
閱讀 3070·2019-08-26 13:25
閱讀 1453·2019-08-26 12:00
閱讀 2470·2019-08-26 11:41
閱讀 3557·2019-08-26 10:31
閱讀 1557·2019-08-26 10:25