很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。

在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。

抽象类

抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以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类继承GenericServlet时,它提供了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

}

接口

接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。以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);

}

}

抽象类和接口的对比

参数

抽象类

接口

默认的方法实现

它可以有默认的方法实现

接口完全是抽象的。它根本不存在方法的实现

实现

子类使用 extends 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。

子类使用关键字 implements 来实现接口。它需要提供接口中所有声明的方法的实现

构造器

抽象类可以有构造器

接口不能有构造器

与正常 Java 类的区别

除了你不能实例化抽象类之外,它和普通Java类没有任何区别

接口是完全不同的类型

访问修饰符

抽象方法可以有 public、protected 和 default 这些修饰符

接口方法默认修饰符是 public。你不可以使用其它修饰符。

main 方法

抽象方法可以有 main 方法并且我们可以运行它

接口没有 main 方法,因此我们不能运行它。

多继承

抽象方法可以继承一个类和实现多个接口

接口只可以继承一个或多个其它接口

速度

它比接口速度要快

接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。

添加新方法

如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。

如果你往接口中添加方法,那么你必须改变实现该接口的类。

什么时候使用抽象类和接口

如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

java 接口和抽象类的区别6_Java抽象类与接口的区别相关推荐

  1. java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别

    .前言 JAVA是一种面向对象语言,具备抽象(Abstract),封装(packing),继承(extends),多态(polymorphic)四大特性. 我们重点从oop思想∠来分析. .在面向对象 ...

  2. java抽象类与接口区别6_java基础知识(6)---抽象类与接口

    抽象类: abstract 抽象:不具体,看不明白.抽象类表象体现. 在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstrac ...

  3. java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...

    在网上看到很多人问关于"抽象类与接口的区别",因此本人想通过自己多年对JAVA开发的经验来总结一下抽象类与接口的区别以及分别在什么情况下使用它们. 在Java语言中, abstra ...

  4. java类接口的区别_java抽象类和接口区别

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  5. 第三次学JAVA再学不好就吃翔(part38)--抽象类与接口的区别

    学习笔记,仅供参考 文章目录 面向对象 接口 类和接口的关系 抽象类与接口的区别 案例学习 面向对象 接口 类和接口的关系 类与类的关系 继承关系,并且只能单继承,不能多继承,但是可以多层继承 类与接 ...

  6. 抽象类(abstract class)和接口(Interface)的区别

    抽象类(abstract class)和接口(Interface)的区别 前言 抽象类(abstract class)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予 ...

  7. Java编程基础10——面向对象_多态抽象类接口

    1.多态的概述及其成员访问特点代码体现 A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提- 1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象. C:多态中的成员 ...

  8. 问题小结(二)——maven的核心功能、面向对象编程和面向接口编程的区别、抽象类和接口的区别等

    文章目录 1. Java创建对象有哪四种方式? 2. 什么是maven?maven的核心功能有哪些? 3. 什么是MVC?说说分层的好处. 4. Spring的两大核心技术是什么? 5. 什么是IOC ...

  9. Java笔记018-抽象类、抽象类最佳实践-模板设计模式、接口、内部类

    目录 抽象类 先看一个问题 小结: 抽象类快速入门 抽象类的介绍 抽象类使用的注意事项和细节讨论 抽象类练习题 抽象类最佳实践-模板设计模式 基本介绍 模板设计模式能解决的问题 最佳实践 最佳实践 接 ...

最新文章

  1. bash shell while语法
  2. IDEA使用switch传入String编译不通过
  3. centos7.x 64位 rpm安装JDK8
  4. strictmath_Java StrictMath sqrt()方法与示例
  5. Type interface com.zhaoka.mapper.DatKcardKmMapper is not known to the MapperRegistry
  6. ASPTODLL风火轮
  7. Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
  8. 误Ghost数据恢复图文教程
  9. vue颜色选择器插件
  10. php版微信公众号消息主动推送_php实现微信公众号主动推送消息
  11. 高中计算机教室标语,高中教室布置标语
  12. 用命令打开文件服务器资源管理器,Windows10使用命令参数打开文件资源管理器的方法...
  13. 优秀程序员的博客有哪些?
  14. 写一个函数,将一个3*3的整型矩阵转置,用指针编写
  15. 汽车漫谈1:汽车的研发到制造过程
  16. matlab时间延迟怎么写,大家帮我看一下这个c_c方法时间延迟的程序运行结果??...
  17. 帝国cms tag生成html,帝国CMS tags标签多种调用方法
  18. Mysql 查询日期格式化 DATE_FORMAT()
  19. Java 微信支付接口(统一下单,异步回调,订单退款,取消订单)
  20. boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.Output

热门文章

  1. Oracle GoldenGate(OGG)基础知识整理
  2. 免费 TR069 管理系统ACS - XACS
  3. 数论概论读书笔记 19.素性测试与卡米歇尔数
  4. 宝塔面板二级目录绑定二级域名
  5. js 字符串 转换成 数字 的方法
  6. 七牛云上传图片,只需十分钟搞定
  7. python 无头模式_selenium 无头模式获取日志performance出错
  8. C#读写EXCEL(OLEDB方式)
  9. c++ sort函数
  10. Android控制闪光灯的方法(打开与关闭)