抽象類與接口同樣,都不能被實例化,能夠有具體實現的方法,也能夠有抽象的方法。在抽象類中,聲明的field是static、final,method但是public、protected、private。而在接口中,聲明的field是public、static、final,method是public。html
抽象類只能做爲子類的超類,子類繼承抽象類時abstract method必須被實現。java
接口是抽象方法的集合。若是實現了這個接口,那麼就必須確保使用這些方法。接口只是一種形式,接口自身不能作任何事情。oracle
在如下狀況,能夠考慮用abstract class:ui
You want to share code among several closely related classes.code
You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).htm
You want to declare non-static or non-final fields. This enables you to define methods that can access and modify the state of the object to which they belong.繼承
在如下狀況,能夠考慮用interface:接口
You expect that unrelated classes would implement your interface. For example, the interfaces Comparable and Cloneable are implemented by many unrelated classes.ip
You want to specify the behavior of a particular data type, but not concerned about who implements its behavior.ci
You want to take advantage of multiple inheritance of type.
參數 | 抽象類 | 接口 |
---|---|---|
默認的方法實現 | 它能夠有默認的方法實現 | 接口徹底是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。若是子類不是抽象類的話,它須要提供抽象類中全部聲明的方法的實現。 | 子類使用關鍵字implements來實現接口。它須要提供接口中全部聲明的方法的實現 |
構造器 | 抽象類能夠有構造器 | 接口不能有構造器 |
與正常Java類的區別 | 除了你不能實例化抽象類以外,它和普通Java類沒有任何區別 | 接口是徹底不一樣的類型 |
訪問修飾符 | 抽象方法能夠有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可使用其它修飾符。 |
main方法 | 抽象方法能夠有main方法而且咱們能夠運行它 | 接口沒有main方法,所以咱們不能運行它。 |
多繼承 | 抽象方法能夠繼承一個類和實現多個接口 | 接口只能夠繼承一個或多個其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。 |
添加新方法 | 若是你往抽象類中添加新的方法,你能夠給它提供默認的實現。所以你不須要改變你如今的代碼。 | 若是你往接口中添加方法,那麼你必須改變實現該接口的類。 |
importnew,Java抽象類與接口的區別.
orcale docs,Abstract Methods and Classes.