一、抽象類(lèi)
1.定義和使用格式
抽象方法:一種特殊的方法吕嘀,只有聲明违寞,而沒(méi)有具體的實(shí)現(xiàn)贞瞒。
抽象類(lèi):在《JAVA編程思想》一書(shū)中,將抽象類(lèi)定義為“包含抽象方法的類(lèi)”趁曼,在類(lèi)前用abstract
修飾军浆。
public abstract class ClassName {
abstract void fun();
}
2.特性
(1) 抽象類(lèi)不允許被實(shí)例化,只能被繼承挡闰。
(2) 抽象類(lèi)可以包含屬性和方法乒融。方法既可以包含代碼實(shí)現(xiàn),也可以是不包含代碼實(shí)現(xiàn)的抽象方法尿这。
(3) 子類(lèi)繼承抽象類(lèi)簇抵,必須實(shí)現(xiàn)抽象類(lèi)中所有的抽象方法。如果子類(lèi)沒(méi)有實(shí)現(xiàn)父類(lèi)的抽象方法射众,那么它也要定義為abstract類(lèi)碟摆。
二、接口
1.定義和使用格式
接口:接口是對(duì)行為的一種抽象叨橱,相當(dāng)于一組協(xié)議或者契約典蜕;調(diào)用者只需要關(guān)注抽象的接口,不需要了解具體的實(shí)現(xiàn)罗洗。
public interface InterfaceName {
}
2.特性
(1) 接口可以有成員變量愉舔,但是成員變量只能是public static final
類(lèi)型的。
(2) 接口只能聲明方法伙菜,方法不能包含代碼的實(shí)現(xiàn)轩缤。
(3) 類(lèi)實(shí)現(xiàn)接口的時(shí)候,必須實(shí)現(xiàn)接口中聲明的所有方法贩绕。
三火的、抽象類(lèi)和接口的區(qū)別
1. 語(yǔ)法層面
(1) 抽象類(lèi)中可以提供成員方法的實(shí)現(xiàn),而接口不行淑倾;
(2) 抽象類(lèi)的成員變量可以是各種類(lèi)型的馏鹤,但是接口中的成員變量只能是public static final類(lèi)型的;
(3) 抽象類(lèi)中可以含有靜態(tài)代碼塊和靜態(tài)方法娇哆,而接口不行湃累;
(4) 抽象類(lèi)可以含有構(gòu)造方法,而接口不行碍讨;
(5) 一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)治力,而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。
2. 設(shè)計(jì)角度
抽象類(lèi)是對(duì)成員變量和方法的抽象垄开,是一種 is-a 關(guān)系琴许,是為了解決代碼復(fù)用問(wèn)題。接口僅僅是對(duì)方法的抽象溉躲,是一種 has-a 關(guān)系榜田,表示具有某一組行為特性,是為了解決解耦問(wèn)題锻梳,隔離接口和具體的實(shí)現(xiàn)箭券,提高代碼的擴(kuò)展性。
四疑枯、其他
要“基于抽象而非實(shí)現(xiàn)編程”辩块,我們?cè)谧鲕浖_(kāi)發(fā)的時(shí)候,一定要有抽象意識(shí)荆永、封裝意識(shí)废亭、接口意識(shí)。越抽象具钥、越頂層豆村、越脫離具體某一實(shí)現(xiàn)的設(shè)計(jì),越能提高代碼的靈活性骂删、擴(kuò)展性掌动、可維護(hù)性。