接口和抽象類都遵循”面向接口而不是實(shí)現(xiàn)編碼”設(shè)計(jì)原則,它可以增加代碼的靈活性,可以適應(yīng)不斷變化的需求。
下面有幾個(gè)點(diǎn)可以幫助你回答這個(gè)問題:在 Java 中,你只能繼承一個(gè)類,但可以實(shí)現(xiàn)多個(gè)接口。所以一旦你繼承了一個(gè)類,你就失去了繼承其他類的機(jī)會(huì)了。
接口通常被用來表示附屬描述或行為如: Runnable 、 Clonable 、 Serializable 等等,因此當(dāng)你使用抽象類來表示行為時(shí),你的類就不能同時(shí)是 Runnable 和 Clonable( 注:這里的意思是指如果把 Runnable 等實(shí)現(xiàn)為抽象類的情況 ) ,因?yàn)樵?Java 中你不能繼承兩個(gè)類,但當(dāng)你使用接口時(shí),你的類就可以同時(shí)擁有多個(gè)不同的行為。
在一些對時(shí)間要求比較高的應(yīng)用中,傾向于使用抽象類,它會(huì)比接口稍快一點(diǎn)。如果希望把一系列行為都規(guī)范在類繼承層次內(nèi),并且可以更好地在同一個(gè)地方進(jìn)行編碼,那么抽象類是一個(gè)更好的選擇。有時(shí),接口和抽象類可以一起使用,接口中定義函數(shù),而在抽象類中定義默認(rèn)的實(shí)現(xiàn)。