接口和抽象類

之前在面試的時(shí)候,有遇到問接口和抽象類的區(qū)別。雖然自己用了很多的接口和抽象類,但是對(duì)于兩種的理解還是不夠高,所以自己再總結(jié)總結(jié)。

1.抽象類

抽象類定義:

 [public] abstract class ClassName {
     abstract void fun();
 }

抽象類需要abstract關(guān)鍵字,類成員可以有成員變量,有具體方法,靜態(tài)方法,靜態(tài)常量,有抽象方法(需要關(guān)鍵字abstract)
不能創(chuàng)建對(duì)象,而且抽象方法不能是private,因?yàn)樗接械木筒荒芾^承了,抽象類就是用來繼承,不讓要他有何用,默認(rèn)不寫是public


2.接口

接口定義:

 [public] interface InterfaceName{
 }

接口狹義來說就是一個(gè)對(duì)外提供的方法,廣義來說就是系統(tǒng)之間對(duì)接的端口
接口里可以有方法(抽象方法),變量(只能是public,而且會(huì)被隱式地指定為public static final變量),一般接口中不會(huì)定義變量的


3.區(qū)別:

a.一個(gè)類可以實(shí)現(xiàn)多接口,但只能繼承一個(gè)抽象類
b.類實(shí)現(xiàn)接口,必須實(shí)現(xiàn)接口里所有方法;類繼承抽象類,也是必須實(shí)現(xiàn)抽象類中所有抽象方法,但是抽象類實(shí)現(xiàn)接口時(shí),不需要實(shí)現(xiàn)所有方法
c.抽象類可以提供正常方法,對(duì)于這一點(diǎn),抽象類的擴(kuò)展要比接口好。比如,在抽象類中定一個(gè)正常方法,他的子類不需要改動(dòng)代碼就有了這個(gè)方法,而在接口中定義一個(gè)方法,而實(shí)現(xiàn)它的類都得去實(shí)現(xiàn)這個(gè)方法,所以在一定程度上抽象類要比接口好
d.在設(shè)計(jì)上,接口是對(duì)行為的抽象,比如飛,跑等等;而抽象類是對(duì)物的抽象,即類的抽象,比如動(dòng)物,鳥類這些;結(jié)合a和c就可以把接口和抽象類的有點(diǎn)結(jié)合起來,這就是缺省適配模式:定義一個(gè)InterfaceA接口;定義一個(gè)AbstractA接口實(shí)現(xiàn)InterfaceA;而A類實(shí)現(xiàn)InterfaceA接口和繼承AbstractA類,具體想了解可以google缺省適配模式;也可以java中的API,我影響比較深的集合的設(shè)計(jì)就用到這種設(shè)計(jì)模式


4.參考:

https://www.cnblogs.com/dolphin0520/p/3811437.html
https://blog.csdn.net/xw13106209/article/details/6923556
https://blog.csdn.net/xw13106209/article/details/6926253

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容