Java抽象類和接口的概念可能經(jīng)常令人困惑,因?yàn)樗鼈冇糜陬愃频那闆r,并提供類似的功能。但這兩者之間還是有一些區(qū)別的,如果你對(duì)這些不太熟悉,建議你考慮參加關(guān)于Java培訓(xùn)的課程。
抽象類
抽象類是不能實(shí)例化的類,它允許其他類從中繼承,但不能自己實(shí)例化。抽象類的唯一目的是讓其他子類從中繼承,它可以用于對(duì)子類施加指導(dǎo)方針和層次結(jié)構(gòu)。
接口
接口不像抽象類那樣是一個(gè)類,但它與抽象類非常相似,它包含沒有簽名(主體)的方法。接口本身不能做任何事情,可以把它當(dāng)成一個(gè)可以復(fù)制和填充的空模板。它也用于強(qiáng)制實(shí)施指導(dǎo)方針和層次結(jié)構(gòu),并為子類提供方法。在Java培訓(xùn)學(xué)習(xí)中,一個(gè)類不能同時(shí)從多個(gè)抽象類繼承,由于缺乏對(duì)多重繼承的支持,因此改用接口。
兩者區(qū)別
接口包含一組尚未實(shí)現(xiàn)的方法,引用接口的類必須重寫這些方法,這可以讓類一次成為兩個(gè)類的一部分(多重繼承)——一個(gè)作為普通子類,一個(gè)作為接口的“子類”。
抽象類將包含方法,然而,總會(huì)有至少一種方法尚未完成。這是抽象類和接口之間的一個(gè)主要區(qū)別。抽象類將提供一個(gè)準(zhǔn)則(基類定義),派生類將從該準(zhǔn)則開始。程序員能夠?qū)崿F(xiàn)這些派生類,只能在抽象類中定義抽象方法,但是,在定義抽象類時(shí),沒有必要定義抽象方法。
除了這一主要區(qū)別之外,這兩者之間還有一些其他區(qū)別:
1、一個(gè)類一次只能從一個(gè)抽象類繼承,但是,一個(gè)類可以從多個(gè)接口繼承。接口用于在面向?qū)ο缶幊讨袑?shí)現(xiàn)多重繼承的概念。想要對(duì)抽象類和接口有更深入的了解,可以報(bào)個(gè)Java培訓(xùn)班來(lái)學(xué)習(xí),有專業(yè)講師面授指導(dǎo)教學(xué),還有實(shí)操項(xiàng)目訓(xùn)練,有助于你在編程中更好的運(yùn)用它們。
2、因?yàn)槌橄箢愂菍?shí)類,所以它可以像普通類一樣為其函數(shù)和屬性使用訪問(wèn)修飾符。因?yàn)榻涌诓皇穷悾运辉试S訪問(wèn)修飾符,默認(rèn)情況下,所有內(nèi)容都被視為公共的(對(duì)所有內(nèi)容開放)。
接口只是一個(gè)空簽名,不包含主體(代碼)。抽象類可以提供代碼,即必須重寫的方法。
4、當(dāng)我們要求類共享類似的行為(或方法)時(shí),使用抽象類。但是,如果我們需要類來(lái)共享方法簽名,而不是方法本身,那么我們應(yīng)該使用接口。
5、我們可以說(shuō),pc機(jī)處理抽象類的速度更快,但這取決于我們編寫的代碼。有時(shí)一個(gè)接口更快(因?yàn)樗皇且欢芽彰Q),有時(shí),抽象類的處理速度更快,因?yàn)閜c不需要為方法引用派生類。Java培訓(xùn)有很多課程可以幫助你區(qū)分抽象類和接口,感興趣的童鞋可以報(bào)名學(xué)習(xí)。
6、向接口添加新方法需要更多時(shí)間,必須為接口和所有引用它的類重寫代碼,包括新方法。向抽象類添加代碼更容易,因?yàn)槲覀兛梢詫⑵溆米髂J(rèn)實(shí)現(xiàn),程序仍將繼續(xù)正常運(yùn)行。
因?yàn)榻涌谑强盏?,所以它不能有常量或字段。抽象類可以包含字段和常量定義。
8、接口可以添加到類的現(xiàn)有功能中。它們不一定是引用它們的類的標(biāo)識(shí)的組成部分;另一方面,抽象類為派生自抽象類的類提供了一個(gè)標(biāo)識(shí),因?yàn)樗鼈儚某橄箢惱^承了它們的行為。
總之,我們可以說(shuō)抽象類和接口之間的主要區(qū)別在于它們包含的方法(完成的與未完成的)及其內(nèi)容(真實(shí)類與空模板)。如果不確定是使用抽象類還是接口,最好是報(bào)個(gè)Java培訓(xùn)班請(qǐng)以便更好地理解高級(jí)Java編程概念,做出更明智的選擇。