不知道有沒有人翻譯過了,這篇是挺簡單的,權當複習一遍內容吧。html
不少常見的面試問題如「抽象類和接口有什麼區別」,「你在何時用抽象類何時用接口」。因此在這篇文章裏面,咱們會討論一下這個話題。
java
在開始討論它們的區別以前,咱們先看看它們的介紹。
面試
抽象類被用來抽象出子類的共同特徵。它是不能被實例化的,它只能被子類繼承做爲超類使用。抽象類被用做它的子類下的層次結構建立模板(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其它關聯方法 }
一個接口是一系列抽象方法的集合。當一個類實現一個接口,就會所以繼承到這個接口裏面的抽象方法。因此它就像簽了一個合約,你實現了這個接口就至關於贊成了這個合約,你就須要去使用它的方法。固然,這只是一個模式,它自身是不能作任何事情的。
翻譯
來看一個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); } }
若是你須要大量的方法而且但願它們當中某些方法有默認實現,那麼選擇抽象類最好不過
若是你想要實現多重繼承,那就須要使用接口。由於java自己是不支持多重繼承的,子類不可以繼承多於一個父類,可是能夠實現多個接口,所以你可使用接口來間接達到多重繼承。
若是你的基本抽象內容常常改變,那麼你應該使用抽象類,由於若是你的基本抽象內容常常改變並且使用接口的話,那麼你就必需要連帶把實現了這個接口的其它類都一併修改。
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.