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