Java中抽象类和接口之间的区别
生活随笔
收集整理的這篇文章主要介紹了
Java中抽象类和接口之间的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一些受歡迎的訪談問題是“抽象類和接口之間有什么區別”,“什么時候使用抽象類以及什么時候使用接口”。 因此,在本文中,我們將討論這個主題。
在探討它們之間的差異之前,讓我們先介紹一下它們。
抽象類
創建抽象類以捕獲子類的共同特征。 它不能被實例化,只能被其子類用作超類。 抽象類用于在層次結構中為其子類創建模板。
讓我們以JDK類GenericServlet為例:
public abstract class GenericServlet implements? Servlet, ServletConfig,Serializable{??? // abstract method??? ?abstract? void ??? service(ServletRequest req, ServletResponse res) ;?void init()??? ?{// Its implementation??? ????}??// other method related to Servlet??? }當HttpServlet擴展Generic servlet時,它提供service()方法的實現:
public class HttpServlet extends GenericServlet {void? service(ServletRequest req, ServletResponse res){// implementation }protected? void? doGet(HttpServletRequest req, HttpServletResponse resp) {// Implementation }protected? void? doPost(HttpServletRequest req, HttpServletResponse resp) {// Implementation }// some other methods related to HttpServlet }接口
接口是抽象方法的集合。 一個類實現一個接口,從而繼承該接口的抽象方法。 因此,這是簽訂合同的方式,您同意如果實現此接口,則必須使用其方法。 它只是一種模式,它本身不能做任何事情。
讓我們以外部化接口為例:
public interface Externalizable extends Serializable {void writeExternal(ObjectOutput out)throws IOException;void readExternal(ObjectInput in)throws IOException,ClassNotFoundException; }實現此接口時,必須實現以上兩種方法:
public class Employee implements Externalizable{ int employeeId;String employeeName;@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {? employeeId=in.readInt();employeeName=(String) in.readObject();}?@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeInt(employeeId);out.writeObject(employeeName);?} }抽象類與接口
| 參數 | 抽象類 | 接口 |
| 默認方法實現 | 它可以具有默認方法實現 | 接口是純抽象的,根本無法實現。 |
| 實作 | 子類使用extends關鍵字來擴展抽象類,除非子類也是抽象類,否則它們需要提供抽象類中所有已聲明方法的實現。 | 子類使用Implements關鍵字實現接口,并且應該為接口中聲明的所有方法提供實現 |
| 建設者 | 抽象類可以有構造函數 | 接口不能有構造函數 |
| 與普通的Java類不同 | 抽象類與Java類幾乎相同,除了您無法實例化它。 | 接口完全不同的類型 |
| 訪問修飾符 | 抽象類方法可以具有public,protected,private和default修飾符 | 接口方法默認為public。 您不能將其與其他訪問修飾符一起使用 |
| Main()方法 | 抽象類可以具有main方法,因此我們可以運行它 | 接口沒有主要方法,因此我們無法運行它。 |
| 多重繼承 | 抽象類可以擴展另一個類,并且可以實現一個或多個接口。 | 接口只能擴展到一個或多個接口 |
| 速度 | 比接口快 | 接口有點慢,因為在類中查找實現方法需要一些時間 |
| 添加新方法 | 如果將新方法添加到抽象類,則可以提供它的默認實現。 因此,您無需更改當前代碼 | 如果向接口添加新方法,則必須更改實現該接口的類 |
何時使用Abstract類和接口:
- 如果您有很多方法,并且想要其中的一些默認實現,那么請使用抽象類
- 如果要實現多重繼承,則必須使用接口。 由于Java不支持多重繼承,因此子類不能擴展一個以上的類,但是您可以實現多個接口,因此可以為此使用接口。
- 如果您的基本合同一直在變化,那么您應該使用抽象類,就像您在不斷更改基本合同并使用接口一樣,那么您必須更改實現該接口的所有類。
Java 8中默認方法和靜態方法的介紹
Oracle試圖通過在接口中引入默認方法和靜態方法的概念來彌合抽象類和接口之間的鴻溝。 因此,現在我們可以在接口中提供方法的默認實現,而不會強制使用類來實現該方法。 我將在下一篇文章中討論這個主題。
翻譯自: https://www.javacodegeeks.com/2014/06/difference-between-abstract-class-and-interface-in-java.html
總結
以上是生活随笔為你收集整理的Java中抽象类和接口之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与JBoss Fuse,Jenkins和
- 下一篇: Sonos 发布 Move 2 户外音响