區(qū)別1:定義關鍵字不同
接口使用關鍵字 interface 來定義。 抽象類使用關鍵字 abstract 來定義。
區(qū)別2:繼承或實現(xiàn)的關鍵字不同
接口使用 implements 關鍵字定義其具體實現(xiàn)。 抽象類使用 extends 關鍵字實現(xiàn)繼承。
區(qū)別3:子類擴展的數(shù)量不同
接口的實現(xiàn)類可以有多個,而抽象類的子類,只能繼承一個抽象類
區(qū)別4:屬性訪問控制符不同
接口中屬性的訪問控制符只能是 public,接口中的屬性默認是 public static final 修飾的。
抽象類中的屬性訪問控制符無限制,可為任意控制符
區(qū)別5:方法控制符不同
接口中方法的默認控制符是 public,并且不能定義為其他控制符,
抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,
區(qū)別6:方法實現(xiàn)不同
接口中普通方法不能有具體的方法實現(xiàn),在 JDK 8 之后 static 和 default 方法必須有方法實現(xiàn),
static 或 default 方法如果沒有方法實現(xiàn)就會報錯,而普通方法如果有方法實現(xiàn)就會報錯。
抽象類中普通方法可以有方法實現(xiàn),抽象方法不能有方法實現(xiàn),
區(qū)別7:靜態(tài)代碼塊使用不同
接口中不能使用靜態(tài)代碼塊,抽象類中可以使用靜態(tài)代碼塊,
接口中可以有public static final 修飾的成員變量
抽象類不能被實例化(初學者很容易犯的錯),如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象。
抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現(xiàn)也就是方法的具體功能。
構造方法,類方法(用 static 修飾的方法)不能聲明為抽象方法。
抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類。
抽象方法需要被實現(xiàn),不能被聲明為靜態(tài),private,final修飾
① 抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
② 設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規(guī)范,它是一種輻射式設計。
1.抽象類的使用場景
既想約束子類具有共同的行為(但不再乎其如何實現(xiàn)),又想擁有缺省的方法,又能擁有實例變量
如:模板方法設計模式,模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中某些步驟的具體實現(xiàn)。
2.接口的應用場景
① 約束多個實現(xiàn)類具有統(tǒng)一的行為,但是不在乎每個實現(xiàn)類如何具體實現(xiàn)
② 作為能夠實現(xiàn)特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。
③ 實現(xiàn)類需要具備很多不同的功能,但各個功能之間可能沒有任何聯(lián)系。
④ 使用接口的引用調(diào)用具體實現(xiàn)類中實現(xiàn)的方法(多態(tài))