专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

抽象类的定义,抽象类和接口的区别

来源:小易整编  作者:小易  发布时间:2023-03-21 02:44
摘要:抽象类的定义,抽象类和接口的区别在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设...

抽象类的定义,抽象类和接口的区别

抽象类的定义,抽象类和接口的区别

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。

不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++这种编程语言只支持抽象类,不支持接口;而像Python这样的动态编程语言,既不支持抽象类,也不支持接口。尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然可以通过一些手段来模拟实现这两个语法概念。

这两个语法概念不仅在工作中经常会被用到,在面试中也经常被提及。比如,“接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程问题?”等等。

你可以先试着回答一下,刚刚我提出的几个问题。如果你对某些问题还有些模糊不清,那也没关系,今天,我会带你把这几个问题彻底搞清楚。下面我们就一起来看!

什么是抽象类和接口?区别在哪里?

不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。Java这种编程语言,既支持抽象类,也支持接口,所以,为了让你对这两个语法概念有比较直观的认识,我们拿Java这种编程语言来举例讲解。

首先,我们来看一下,在Java这种编程语言中,我们是如何定义抽象类的。

下面这段代码是一个比较典型的抽象类的使用场景(模板设计模式)。Logger是一个记录日志的抽象类,FileLogger和MessageQueueLogger继承Logger,分别实现两种不同的日志记录方式:记录日志到文件中和记录日志到消息队列中。FileLogger和MessageQueueLogger两个子类复用了父类Logger中的name、enabled、minPermittedLevel属性和log()方法,但因为这两个子类写日志的方式不同,它们又各自重写了父类中的doLog()方法。

// 抽象类 public abstract class Logger {  private String name;  private boolean enabled;  private Level minPermittedLevel;  public Logger(String name, boolean enabled, Level minPermittedLevel) {    this.name = name;    this.enabled = enabled;    this.minPermittedLevel = minPermittedLevel;  }    public void log(Level level, String message) {    boolean loggable = enabled && (minPermittedLevel.intValue() <= level.intValue());    if (!loggable) return;    doLog(level, message);  }    protected abstract void doLog(Level level, String message); } // 抽象类的子类:输出日志到文件 public class FileLogger extends Logger {  private Writer fileWriter;  public FileLogger(String name, boolean enabled,    Level minPermittedLevel, String filepath) {    super(name, enabled, minPermittedLevel);    this.fileWriter = new FileWriter(filepath);  }    @Override  public void doLog(Level level, String mesage) {    // 格式化level和message,输出到日志文件    fileWriter.write(...);  } } // 抽象类的子类: 输出日志到消息中间件(比如kafka) public class MessageQueueLogger extends Logger {  private MessageQueueClient msgQueueClient;    public MessageQueueLogger(String name, boolean enabled,    Level minPermittedLevel, MessageQueueClient msgQueueClient) {    super(name, enabled, minPermittedLevel);    this.msgQueueClient = msgQueueClient;  }    @Override  protected void doLog(Level level, String mesage) {    // 格式化level和message,输出到消息中间件    msgQueueClient.send(...);  } }

通过上面的这个例子,我们来看一下,抽象类具有哪些特性。我总结了下面三点。

  • 抽象类不允许被实例化,只能被继承。也就是说,你不能new一个抽象类的对象出来(Logger logger = new Logger(...);会报编译错误)。

  • 抽象类可以包含属性和方法。方法既可以包含代码实现(比如Logger中的log()方法),也可以不包含代码实现(比如Logger中的doLog()方法)。不包含代码实现的方法叫作抽象方法。

  • 子类继承抽象类,必须实现抽象类中的所有抽象方法。对应到例子代码中就是,所有继承Logger抽象类的子类,都必须重写doLog()方法。

刚刚我们讲了如何定义抽象类,现在我们再来看一下,在Java这种编程语言中,我们如何定义接口。

// 接口 public interface Filter {  void doFilter(RpcRequest req) throws RpcException; } // 接口实现类:鉴权过滤器 public class AuthencationFilter implements Filter {  @Override  public void doFilter(RpcRequest req) throws RpcException {    //...鉴权逻辑..  } } // 接口实现类:限流过滤器 public class RateLimitFilter implements Filter {  @Override  public void doFilter(RpcRequest req) throws RpcException {    //...限流逻辑...  } } // 过滤器使用Demo public class Application {  // filters.add(new AuthencationFilter());  // filters.add(new RateLimitFilter());  private List<Filter> filters = new ArrayList<>();    public void handleRpcRequest(RpcRequest req) {    try {      for (Filter filter : filters) {        filter.doFilter(req);      }    } catch(RpcException e) {      // ...处理过滤结果...    }    // ...省略其他处理逻辑...  } }

上面这段代码是一个比较典型的接口的使用场景。我们通过Java中的interface关键字定义了一个Filter接口。AuthencationFilter和RateLimitFilter是接口的两个实现类,分别实现了对RPC请求鉴权和限流的过滤功能。

代码非常简洁。结合代码,我们再来看一下,接口都有哪些特性。我也总结了三点。

  • 接口不能包含属性(也就是成员变量)。

  • 接口只能声明方法,方法不能包含代码实现。

  • 类实现接口的时候,必须实现接口中声明的所有方法。

前面我们讲了抽象类和接口的定义,以及各自的语法特性。从语法特性上对比,这两者有比较大的区别,比如抽象类中可以定义属性、方法的实现,而接口中不能定义属性,方法也不能包含代码实现等等。除了语法特性,从设计的角度,两者也有比较大的区别。

抽象类实际上就是类,只不过是一种特殊的类,这种类不能被实例化为对象,只能被子类继承。我们知道,继承关系是一种is-a的关系,那抽象类既然属于类,也表示一种is-a的关系。相对于抽象类的is-a关系来说,接口表示一种has-a关系,表示具有某些功能。对于接口,有一个更加形象的叫法,那就是协议(contract)。

抽象类和接口能解决什么编程问题?

刚刚我们学习了抽象类和接口的定义和区别,现在我们再来学习一下,抽象类和接口存在的意义,让你知其然知其所以然。

首先,我们来看一下,我们为什么需要抽象类?它能够解决什么编程问题?

刚刚我们讲到,抽象类不能实例化,只能被继承。而前面的章节中,我们还讲到,继承能解决代码复用的问题。所以,抽象类也是为代码复用而生的。多个子类可以继承抽象类中定义的属性和方法,避免在子类中,重复编写相同的代码。

不过,既然继承本身就能达到代码复用的目的,_x0008_而继承也并不要求父类一定是抽象类,那我们不使用抽象类,照样也可以实现继承和复用。从这个角度上来讲,我们貌似并不需要抽象类这种语法呀。那抽象类除了解决代码复用的问题,还有什么其他存在的意义吗?

我们还是拿之前那个打印日志的例子来讲解。我们先对上面的代码做下改造。在改造之后的代码中,Logger不再是抽象类,只是一个普通的父类,删除了Logger中log()、doLog()方法,新增了isLoggable()方法。FileLogger和MessageQueueLogger还是继承Logger父类,以达到代码复用的目的。具体的代码如下:


本文地址:百科问答频道 https://www.neebe.cn/wenda/934773.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • 键盘接口是什么意思?

    键盘接口是什么意思?

    键盘接口一般是用于挂接键盘的接口。它也称为键盘插座或键盘接头,它是一个连接键盘和计算机系统之间的重要硬件部件。键盘接口可以用来接收键盘上发出信号,以便在主板上发出完整的指令。键盘接口可以分为有线和无线两种,有线键盘接口是指采用插孔的连接方...

  • 机箱风扇接口接的位置介绍

    机箱风扇接口接的位置介绍

    电脑使用长时间主机会堆积很多灰尘,特别是主机风扇转动,灰尘是很多的,有的会p电脑的网友就会自己购买新风扇来更换安装新风扇,可是问题就出来了,找不到风扇的接口,那么机箱风扇接口接哪里呢?说的这里其实对于不熟悉电路的网友可能还不清楚机箱的内部结...

  • 键盘接口损坏怎么修复?

    键盘接口损坏怎么修复?

    按道理说,主板上的键盘接口接上键盘后,又不经常拔插,不应该容易损坏的。但在实际工作中键盘接口损坏的主板却又非常多,大多表现为起初是偶尔启动计算机时主机报键盘错误,按“F1”继续能够正常操作,再后来就是键盘有时能够使用有时不能够使用,到最后键...

  • 离线导航与在线导航有什么区别(开车用离线导航还是离线地图)

    离线导航与在线导航有什么区别(开车用离线导航还是离线地图)

    最早之前,开车要是不认识路,就需要下车找人询问,复杂的道路往往问了一次又一次才能找到。现在不认识路已经不是问题了,汽车上的导航都很准确,你完全没去过的地方跟着导航就能轻松找到。不过不知道大家注意到没有,现在的车上的导航有离线模式和在线模式,...

  • SFP接口是什么意思?

    SFP接口是什么意思?

    SFP接口(SmallFormFactorPluggable)是指网络标准尺寸(MSA)提出的一种高速光纤传输产品,主要用于提供高端网络应用系统,如以太网,快速以太网,千兆以太网,FDDI和ATM中继网络。它是网络应用中最常见的、最...

  • TPM接口是什么意思?

    TPM接口是什么意思?

    TPM(TrustedPlatformModule),又叫被信任平台模块,是一种模块化解决方案,它可以将与计算机系统安全相关的特定功能集成到计算机硬件中,以确保计算机系统的安全。TPM提供了在软件中复制不可能的安全服务,它可以使计算...

  • 个人支付宝api接口步骤

    个人支付宝api接口步骤

    个人支付宝api接口我们应该怎么弄呢,今天我们就来说说。操作方法01首先我们要找到的一定是支付宝官网,不然你的隐秘信息可能会泄露。然后登录或者注册支付宝账号。02...

  • 网线接口是什么意思?

    网线接口是什么意思?

    网线接口(也称为RJ-45接口)是一种用于连接电子设备/计算机之间的网络连接一体型接口,它由8根双绞合线组成,它们分别编号(1-8)。最常见的使用场景,就是将网线接口用于连接局域网中相邻电脑设备(如路由器、交换机、防火墙等)、局域网和In...

  • 周排行
  • 月排行
  • 年排行

精彩推荐