詳細(xì)解析Java中抽象類和接口的區(qū)別

字號(hào):

在Java語(yǔ)言中, abstract class 和interface 是支持抽象類定義的兩種機(jī)制。正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的 面向?qū)ο竽芰?。abstract class和interface之間在對(duì)于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發(fā)者在進(jìn) 行抽象類定義時(shí)對(duì)于abstract class和interface的選擇顯得比較隨意。其實(shí),兩者之間還是有很大的區(qū)別的,對(duì)于它們的選擇甚至反映出對(duì) 于問(wèn)題領(lǐng)域本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的理解是否正確、合理。本文將對(duì)它們之間的區(qū)別進(jìn)行一番剖析,試圖給開發(fā)者提供一個(gè)在二者之間進(jìn)行選擇的依據(jù)。
    理解抽象類
    abstract class和interface在Java語(yǔ)言中都是用來(lái)進(jìn)行抽象類(本文 中的抽象類并非從abstract class翻譯而來(lái),它表示的是一個(gè)抽象體,而abstract class為Java語(yǔ)言中用于定義抽象類的一種方法, 請(qǐng)讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類能為我們帶來(lái)什么好處呢?
    在 面向?qū)ο蟮母拍钪?,我們知道所有的?duì)象都是通過(guò)類來(lái)描繪的,但是反過(guò)來(lái)卻不是這樣。并不是 所有的類都是用來(lái)描繪對(duì)象的,如果一個(gè)類中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類就是抽象類。抽象類往往用來(lái)表征我們?cè)趯?duì)問(wèn)題領(lǐng)域進(jìn)行分析、 設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。比如:如果我們進(jìn)行一個(gè)圖形編輯軟件的開發(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)的具體概念,所以用以表征抽象概念的抽象類是不能夠?qū)嵗摹?BR>    在面向?qū)ο箢I(lǐng)域,抽象類主要用來(lái)進(jìn)行類型隱藏。 我們可以構(gòu)造出一個(gè)固定的一組行為的抽象描 述,但是這組行為卻能夠有任意個(gè)可能的具體實(shí)現(xiàn)方式。這個(gè)抽象描述就是抽象類,而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。模塊可以操作一個(gè) 抽象體。由于模塊依賴于一個(gè)固定的抽象體,因此它可以是不允許修改的;同時(shí),通過(guò)從這個(gè)抽象體派生,也可擴(kuò)展此模塊的行為功能。熟悉OCP的讀者一定知 道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計(jì)的一個(gè)最核心的原則OCP(Open-Closed Principle),抽象類是其中的關(guān)鍵所在。
    從語(yǔ)法定義層面看abstract class 和 interface
    在語(yǔ)法層面,Java語(yǔ)言對(duì)于abstract class和interface給出了不同的定義方式,下面以定義一個(gè)名為Demo的抽象類為例來(lái)說(shuō)明這種不同。
    使用abstract class的方式定義Demo抽象類的方式如下:
    abstract class Demo{
    abstract void method1();
    abstract void method2();
    …
    }
    使用interface的方式定義Demo抽象類的方式如下:
    interface Demo{
    void method1();
    void method2();
    …
    }
    在abstract class方式中,Demo可以有自己的數(shù)據(jù)成員,也可以有非 abstract的成員方法,而在interface方式的實(shí)現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final 的,不過(guò)在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。從某種意義上說(shuō),interface是一種特殊形式的 abstract class。