不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧。
很多常见的面试问题如“抽象类和接口有什么区别”,“你在什么时候用抽象类什么时候用接口”。所以在这篇文章里面,我们会讨论一下这个话题。
在开始讨论它们的区别之前,我们先看看它们的介绍。
抽象类被用来抽象出子类的共同特征。它是不能被实例化的,它只能被子类继承作为超类使用。抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to create template for its sub classes down the hierarchy.)。
来用JDK的自带GenericServlet类举一个例子:
  public abstract class GenericServlet implements  Servlet, ServletConfig,Serializable{    
       // 抽象方法   
        abstract  void service(ServletRequest req, ServletResponse res) ; 
        void init()     {
             // 方法的实现      
         }  
           // 其它Servlet的关联方法   
    } 
 
当HttpServlet继承了 Generic servlet, 它要提供service() 方法的实现(因为父类service()方法是抽象方法,子类必须实现):
  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 接口的例子:
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;
 @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.
【翻译】JAVA中抽象类和接口的区别,布布扣,bubuko.com
原文:http://my.oschina.net/u/203607/blog/295965