Java中抽象類與接口的區(qū)別
抽象類與接口緊密相關(guān)。然而接口又比抽象類更抽象,它們之間明顯存在區(qū)別。那到底存在哪些方面的區(qū)別呢?下面學(xué)習(xí)啦小編給大家講講Java中抽象類與接口的區(qū)別。
一、抽象類
在面向?qū)ο蠓椒ㄖ?,抽象類主要用來進(jìn)行類型隱藏。構(gòu)造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實(shí)現(xiàn)方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴(kuò)展此模塊的行為功能。為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關(guān)鍵所在。
二、接口
使用interface來定義一個接口。接口定義同類的定義類似,也是分為接口的聲明和接口體,其中接口體由常量定義和方法定義兩部分組成。
三、抽象類與接口的區(qū)別
1,抽象類里可以有構(gòu)造方法,而接口內(nèi)不能有構(gòu)造方法。
2,抽象類中可以有普通成員變量,而接口中不能有普通成員變量。
3,抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,不能有非抽象的普通方法。
4,抽象類中的抽象方法的訪問類型可以是public ,protected和默認(rèn)類型,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。
5,抽象類中可以包含靜態(tài)方法,接口內(nèi)不能包含靜態(tài)方法。
6,抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static類型,并且默認(rèn)為public static類型。
7,一個類可以實(shí)現(xiàn)多個接口,但只能繼承一個抽象類。
8.接口更多的是在系統(tǒng)框架設(shè)計方法發(fā)揮作用,主要定義模塊之間的通信,而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用。
小編推薦:抽象類運(yùn)用實(shí)例
1.C++
為了讓一個類成為抽象類,至少必須有一個純虛函數(shù)。包含至少一個純虛函數(shù)的類視為抽象類。
純虛函數(shù)形式如下:
例如,類A有兩個純虛函數(shù)lock()、unlock()和一個虛析構(gòu)函數(shù):
將函數(shù)lock()和unlock()初始化為0使它們成為純虛函數(shù),沒有0這個初使化器,它們僅僅是虛函數(shù)。
抽象類對于提供模式、藍(lán)圖和后代類遵循的原則有用,如果遵循了藍(lán)圖的語義,后代類的行為可能按抽象類提供者和使用者所期望的那樣。
通過使用抽象類,C++程序員可以提供C++組件的規(guī)范,在它的構(gòu)建中指導(dǎo)組件的實(shí)現(xiàn)者。
2.C#
抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。如果派生類沒有實(shí)現(xiàn)所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實(shí)現(xiàn)抽象方法由overriding方法來實(shí)現(xiàn)。