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