接口(interface)和抽象類(lèi)(abstract class)都是Java中用來(lái)實(shí)現(xiàn)多態(tài)性的機(jī)制。它們的區(qū)別如下:
1.定義:抽象類(lèi)是一個(gè)類(lèi),可以有普通方法和抽象方法,其中抽象方法必須被子類(lèi)實(shí)現(xiàn);接口是一組抽象方法的集合,所有方法都是抽象方法,且沒(méi)有具體實(shí)現(xiàn)。
2.實(shí)現(xiàn):子類(lèi)只能繼承一個(gè)抽象類(lèi),但可以實(shí)現(xiàn)多個(gè)接口。
3.構(gòu)造函數(shù):抽象類(lèi)可以有構(gòu)造函數(shù),接口沒(méi)有構(gòu)造函數(shù)。
4.變量:抽象類(lèi)可以有變量,接口只能定義常量。
5.訪問(wèn)控制:抽象類(lèi)中的方法可以是public、protected和default訪問(wèn)控制,而接口中的方法默認(rèn)是public。
6.默認(rèn)實(shí)現(xiàn):抽象類(lèi)可以有普通方法的默認(rèn)實(shí)現(xiàn),而接口中所有的方法都沒(méi)有默認(rèn)實(shí)現(xiàn)。
7.繼承:子類(lèi)繼承抽象類(lèi)時(shí)必須實(shí)現(xiàn)其中的抽象方法,否則該子類(lèi)也必須是抽象類(lèi);子類(lèi)實(shí)現(xiàn)接口時(shí)必須實(shí)現(xiàn)其中的所有方法。
總之,抽象類(lèi)是對(duì)類(lèi)抽象,接口是對(duì)行為抽象。如果一個(gè)類(lèi)具有一些共同的屬性和行為,那么可以將這些共同的屬性和行為放到抽象類(lèi)中,讓子類(lèi)繼承并實(shí)現(xiàn)其中的抽象方法。如果一個(gè)類(lèi)只是具有一些共同的行為,那么可以將這些共同的行為定義到接口中,讓實(shí)現(xiàn)該接口的類(lèi)來(lái)實(shí)現(xiàn)其中的方法。