接口類和接口的區別
抽象類和接口的區別在我們面試中經常被問到,日常開發中用的最多的是接口,那抽象類和接口的區別是什麼呢?
抽象類
在面向對象的概念中,類是用來描繪用來描繪對象的,而抽象類是包含抽象方法的類,換言之抽象類是不能完全描繪對象的類。
所以抽象類是提供抽象方法用於繼承的,不能實例化。
抽象類的定義:
抽象類是通過abstract修飾的。
抽象方法時通過abstract修飾的
抽象方法沒有具體的方法內容,無方法體,需要在子類中具體定義。
繼承抽象類的抽象方法需要繼承抽象方法
子類繼承父類使用extends。
子類可以繼承的抽象方法中調用抽象類中的變量和成員方法(非私有默認爲public)。
[public] abstract class ClassName {
// 變量
abstract void fun();
// 成員方法
// 構造函數
}
接口
我們定義一些通用的抽象方法和靜態常量用於實現類的具體實現和調用,接口不是類。
接口的定義:
接口是通過interface修飾的。
接口中的方法默認是public static修飾的(也只能是public static)。
接口中的常量默認是public static final修飾的(也只能通過public static final修飾).
實現類實現接口通過implements。
實現類需要實現接口中所有的方法,而常量可以通過interfaName.靜態常量來使用.
[public] interface InterfaceName {
[public static final] 類型 常量名;
[public abstract] 返回類型 methodName(arg) ;
[static|default]void methodName(args){
// 具體實現
}
}
抽象類和接口的區別
參數 | 抽象類 | 接口 |
---|---|---|
默認的方法實現 | 它可以有默認的方法實現 | 接口完全是抽象的(jdk1.7, jdk1.8新特性 static和default修飾的是可以有具體實現的)。 |
實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。 | 子類使用關鍵字implements來實現接口。它需要提供接口中所有聲明的方法的實現 |
構造器 | 抽象類可以有構造器 | 接口不能有構造器 |
與正常Java類的區別 | 抽象方法可以有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可以使用其它修飾符。 |
訪問修飾符 | 它可以有默認的方法實現 | 接口完全是抽象的(jdk1.7, jdk1.8新特性 static和default修飾的是可以有具體實現的)。 |
數量 | 可以繼承單個抽象類 | 只能實現多個接口 |