之前在面試的時(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