Java 抽象類(lèi)與接口區(qū)別是什么?
1、抽象類(lèi)可以提供某些方法的部分實(shí)現(xiàn),而接口不可以;
2、抽象類(lèi)是單個(gè)繼承機(jī)制,其子類(lèi)不一定要實(shí)現(xiàn)父類(lèi)中的所有沒(méi)實(shí)現(xiàn)的方法,而接口一個(gè)類(lèi)可以有多個(gè)接口,并且方法都要實(shí)現(xiàn)。
理解抽象類(lèi)
abstractclass和interface在Java語(yǔ)言中都是用來(lái)進(jìn)行抽象類(lèi)(本文中的抽象類(lèi)并非從abstractclass翻譯而來(lái),它表示的是一個(gè)抽象體,而abstractclass為Java語(yǔ)言中用于定義抽象類(lèi)的一種方法,請(qǐng)讀者注意區(qū)分)定義的,那么什么是抽象類(lèi),使用抽象類(lèi)能為我們帶來(lái)什么好處呢?
在面向?qū)ο蟮母拍钪?,我們知道所有的?duì)象都是通過(guò)類(lèi)來(lái)描繪的,但是反過(guò)來(lái)卻不是這樣。并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如果一個(gè)類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)就是抽象類(lèi)。抽象類(lèi)往往用來(lái)表征我們?cè)趯?duì)問(wèn)題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。比如:如果我們進(jìn)行一個(gè)圖形編輯軟件的開(kāi)發(fā),就會(huì)發(fā)現(xiàn)問(wèn)題領(lǐng)域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個(gè)概念,形狀這個(gè)概念在問(wèn)題領(lǐng)域是不存在的,它就是一個(gè)抽象概念。正是因?yàn)槌橄蟮母拍钤趩?wèn)題領(lǐng)域沒(méi)有對(duì)應(yīng)的具體概念,所以用以表征抽象概念的抽象類(lèi)是不能夠?qū)嵗摹?/p>
在面向?qū)ο箢I(lǐng)域,抽象類(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ò)展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計(jì)的一個(gè)最核心的原則 OCP(Open-ClosedPrinciple),抽象類(lèi)是其中的關(guān)鍵所在。
推薦教程:《Java教程》