一些受欢迎的访谈问题是“抽象类和接口之间有什么区别”,“什么时候使用抽象类以及什么时候使用接口”。 因此,在本文中,我们将讨论这个主题。

在探讨它们之间的差异之前,让我们先介绍一下它们。

抽象类

创建抽象类以捕获子类的共同特征。 它不能被实例化,只能被其子类用作超类。 抽象类用于在层次结构中为其子类创建模板。

让我们以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中抽象类和接口之间的区别相关推荐

  1. Java中抽象类和接口在概念、语法和应用上的区别和关系

    2019独角兽企业重金招聘Python工程师标准>>> 春招开始了,盆友们都忙着准备笔试.准备面试,复习学过的知识点,当然我也不例外,在这里祝每一个"有心人"心想 ...

  2. Java中类、抽象类、接口之间的区别和联系。

    Java中类.抽象类.接口之间的区别和联系. 程序设计所面对的问题域--客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议).把客观世界中的事物映射到面 ...

  3. php 抽象类 接口 区别,PHP中抽象类和接口有什么区别

    PHP中抽象类和接口有什么区别 发布时间:2021-02-18 15:02:14 来源:亿速云 阅读:70 作者:Leah 这篇文章将为大家详细讲解有关PHP中抽象类和接口有什么区别,文章内容质量较高 ...

  4. 关于Java中抽象类和接口的一点思索

    Java中抽象类和接口的一点思索 成员方法上的区别: 1. java中的抽象类可以提供成员方法的实现细节,抽象方法只能是被public和protected来修饰 配合abstract关键字,子类需要实 ...

  5. 类、抽象类、接口之间的区别

    目录 1.类与抽象类的异同之处 (1)类和抽象类的区别 (2)类和抽象类的相同之处 2.接口与类的异同之处 (1)接口与类相似点 (2)接口与类的区别 (3)接口特性 3.抽象类和接口的区别 1.类与 ...

  6. java中抽象类和接口的作用与区别

    抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract ...

  7. 详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

  8. Java中抽象类、接口、父类直接的区别与联系

    抽象类与接口的区别: 1)抽象类是一个只有变量或方法申明的类,这些变量(属性)和方法都是抽象类型的.抽象类没有对方法的实现. 2)接口则是一个只有方法申明.没有方法的实现,接口的方法也同样是抽象方法, ...

  9. 【转】详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

最新文章

  1. html页面加空的行,html-插入高度较小的空白表行
  2. 计算机毕业论文过程管理手册,毕业论文过程管理手册(修改)-陈亚琴.doc
  3. Spring Cloud之网关搭建
  4. 哪个星座更适合做产品经理?
  5. 【Python】Modin,只需一行代码加速你的Pandas
  6. PAT1050 螺旋矩阵 (25 分)【全部通过 关于段错误的原因 以及测试点7】
  7. 李晓菁201771010114《面向对象程序设计(java)》第十三周学习总结
  8. 爬虫如何监听插件_NodeJS概述2-事件插件-简易爬虫
  9. BeginnersBook Kotlin 教程
  10. 北京交大计算机学院院长,蔡伯根(北京交大教授)
  11. html 自动生产,【SQL】用Sql Server自动生产html格式的数据字典
  12. 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
  13. maven2+依赖传递
  14. Android常用Adapter用例
  15. kubernetes视频教程笔记 (15)-RC、RS和Deployment的关联
  16. gitlab+jenkins+maven+docker持续集成(二)——maven安装配置
  17. 2010.11.18 关于向窗口发送消息
  18. Git 可视化工具 Fork 使用指南
  19. 关于android中的armeabi、armeabi-v7a、arm64-v8a及x86等
  20. 根据身份证号判断该人的年龄、性别、出生年月日

热门文章

  1. React中解决样式丢失问题
  2. vue的基本项目结构
  3. IntelliJ IDEA: 无法创建Java Class文件
  4. springboot创建项目
  5. django ajax 简书,Django_ajax
  6. 散列算法,Remal使用散列算法
  7. Maven常见问题之【-Dmaven.multiModuleProjectDirctory system property is not set】
  8. nginx应用领域分类+事件模型
  9. restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素
  10. spring 注释_Spring@懒惰注释