abstract 類和 interface 類的區別
阿新 • • 發佈:2021-09-16
相同點
- 兩者都是抽象類,都不能夠被例項化
- 兩者的實現類都必須實現兩者中的抽象方法
不同點
抽象類
/** * 抽象方法 * 預設修飾符為friendly ,實際上並沒有這個關鍵字 * 可以有自己私有的成員變數 * 沒有預設方法,可以有自己的私有方法和公共的方法,私有方法不能被子類呼叫,公共的方法可以被子類的例項呼叫 * 只有抽象的方法可以被子類重寫 */ public abstract class AbstractDemo1 { private String str; public String getStr(){ return "666"; } private String get(){ return "666"; } public abstract String a(); }
在其實現類中無法找到get方法
介面
/** * 顯示灰色說明是可以省略的, * 介面中只能定義常量,不能有私有的,可變的成員變數 * 介面中除了有抽象方法外,也可以有預設方法,預設方法可以有方法體 * 介面的實現類,抽象方法必須被重寫,預設方法可以選擇性被重寫,不重寫 實現類呼叫的是介面的預設方法 * */ public interface InterfaceDemo1 { public static final String name = "張三"; public abstract String a(); default String b(){ return "666"; } }
選擇性重寫b()方法
interface類的應用場合
- 類與類之前需要特定的介面進行協調,而不在乎其如何實現。
- 作為能夠實現特定功能的標識存在,也可以是什麼介面方法都沒有的純粹標識。
- 需要將一組類視為單一的類,而呼叫者只通過介面來與這組類發生聯絡。
- 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯絡。
abstract類的應用場合
- 定義了一組介面,但又不想強迫每個實現類都必須實現所有的介面。可以用abstract class定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋。
- 某些場合下,只靠純粹的介面不能滿足類與類之間的協調,還必需類中表示狀態的變數來區別不同的關係。abstract的中介作用可以很好地滿足這一點。
- 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能。