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;


 @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); }
}

抽象类与接口

参数 抽象类 接口
默认方法实现 它可以具有默认方法实现 接口是纯抽象的,根本无法实现。
实作 子类使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值