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