【翻譯】JAVA中抽象類和接口的區別

不知道有沒有人翻譯過了,這篇是挺簡單的,權當複習一遍內容吧。html

不少常見的面試問題如「抽象類和接口有什麼區別」,「你在何時用抽象類何時用接口」。因此在這篇文章裏面,咱們會討論一下這個話題。
java

在開始討論它們的區別以前,咱們先看看它們的介紹。
面試


Abstract class 抽象類

抽象類被用來抽象出子類的共同特徵。它是不能被實例化的,它只能被子類繼承做爲超類使用。抽象類被用做它的子類下的層次結構建立模板(Abstract classes are used to create template  for its sub classes down the hierarchy.)。ide

來用JDK的自帶GenericServlet類舉一個例子:post

  public abstract class GenericServlet implements  Servlet, ServletConfig,Serializable{    
       // 抽象方法   
        abstract  void service(ServletRequest req, ServletResponse res) ; 
        void init()     {
             // 方法的實現      
         }  
           // 其它Servlet的關聯方法   
    }

當HttpServlet繼承了 Generic servlet, 它要提供service() 方法的實現(由於父類service()方法是抽象方法,子類必須實現):spa

  public class HttpServlet extends GenericServlet
  {
           void service(ServletRequest req, ServletResponse res)
           {
               // 實現
           }
    
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            {
                // 實現
            }
    
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            {
                // 實現
            }
    
    // HttpServlet其它關聯方法
  }


Interface 接口

一個接口是一系列抽象方法的集合。當一個類實現一個接口,就會所以繼承到這個接口裏面的抽象方法。因此它就像簽了一個合約,你實現了這個接口就至關於贊成了這個合約,你就須要去使用它的方法。固然,這只是一個模式,它自身是不能作任何事情的。
翻譯

來看一個Externalizable 接口的例子:code

public interface Externalizable
extends Serializable
{

    void writeExternal(ObjectOutput out)
            throws IOException;
    void readExternal(ObjectInput in)
            throws IOException,
            ClassNotFoundException;
}

當你實現這個接口,你須要去實現上面兩個方法:orm

public class Employee implements Externalizable{ 

 int employeeId;
 String employeeName;


 @Override
 public void readExternal(ObjectInput in) throws IOException,
 ClassNotFoundException {  employeeId=in.readInt();
  employeeName=(String) in.readObject();
  
 } @Override
 public void writeExternal(ObjectOutput out) throws IOException {

  out.writeInt(employeeId);
  out.writeObject(employeeName); }
}

Abstract class vs Interface 抽象類和接口的區別

比較參數 抽象類 接口
默認方法實現 能夠有默認的方法實現 接口是單純的抽象,沒有實現
實現

子類使用 extends 關鍵字去集成一個抽象類,須要在子類裏面對抽象類聲明的全部抽象方法提供實現方法,若是子類也是抽象類則不須要。
htm

子類使用 implements 關鍵字去實現接口,須要在子類裏面對接口聲明的全部方法提供實現方法。

構造器 抽象類能夠有構造器 接口不能有構造器
和普通java類的區別

抽象類大部分和普通java類同樣除了不能實例化它。

接口是徹底不一樣的類型

訪問修飾符

抽象類能夠有public protected private和default修飾符

接口方法默認都是public,不能使用其餘修飾符。

Main() 方法

抽象類能夠有main() 方法,因此咱們能夠執行它

接口不能有main()方法,因此咱們不能執行它

多重繼承

抽象類能夠集成一個其餘的類和實現一個或多個接口

接口只能繼承一個或多個接口

速度 比接口快

接口相對較慢,它要用必定時間去找類裏面的實現方法

增長新的方法

若是想要給抽象類增長新的方法,你能夠對它提供默認的實現,所以你不須要去改變你當前的代碼

If you add new method to interface, you have to change the classes which are implementing that interface

若是你要對接口增長新的方法,你須要去修改實現了該接口的類。

何時使用抽象類和接口:

  • 若是你須要大量的方法而且但願它們當中某些方法有默認實現,那麼選擇抽象類最好不過

  • 若是你想要實現多重繼承,那就須要使用接口。由於java自己是不支持多重繼承的,子類不可以繼承多於一個父類,可是能夠實現多個接口,所以你可使用接口來間接達到多重繼承。

  • 若是你的基本抽象內容常常改變,那麼你應該使用抽象類,由於若是你的基本抽象內容常常改變並且使用接口的話,那麼你就必需要連帶把實現了這個接口的其它類都一併修改。


java 8裏面的default和static方法介紹

Oracle 一直試圖在接口中引進default和static方法的概念用以彌補抽象類和接口之間的間隙。因此如今咱們能夠在接口中提供方法的default實現而不強迫子類去實現它。我將會再下一個post裏談談這個新東西。


相關連接:Difference between Abstract Class and Interface in java from our JCG partner Arpit Mandliya at the Java frameworks and design patterns for beginners blog.

相關文章
相關標籤/搜索