接口 VS 抽象类的区别?

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南) 本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。 阅读详情

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

       不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,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 : fitlers) {
        filter.doFilter(req);
      }
    } catch(RpcException e) {
      // ...处理过滤结果...
    }
    // ...省略其他处理逻辑...
  }
}

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

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

  • 接口不能包含属性(也就是成员变量)。
  • 接口只能声明方法,方法不能包含代码实现。
  • 类实现接口的时候,必须实现接口中声明的所有方法。

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

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

 

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

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

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

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

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

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


// 父类:非抽象类,就是普通的类. 删除了log(),doLog(),新增了isLoggable().
public class Logger {
  private String name;
  private boolean enabled;
  private Level minPermittedLevel;

  public Logger(String name, boolean enabled, Level minPermittedLevel) {
    //...构造函数不变,代码省略...
  }

  protected boolean isLoggable() {
    boolean loggable = enabled && (minPermittedLevel.intValue() <= level.intValue());
    return loggable;
  }
}
// 子类:输出日志到文件
public class FileLogger extends Logger {
  private Writer fileWriter;

  public FileLogger(String name, boolean enabled,
    Level minPermittedLevel, String filepath) {
    //...构造函数不变,代码省略...
  }
  
  public void log(Level level, String mesage) {
    if (!isLoggable()) return;
    // 格式化level和message,输出到日志文件
    fileWriter.write(...);
  }
}
// 子类: 输出日志到消息中间件(比如kafka)
public class MessageQueueLogger extends Logger {
  private MessageQueueClient msgQueueClient;
  
  public MessageQueueLogger(String name, boolean enabled,
    Level minPermittedLevel, MessageQueueClient msgQueueClient) {
    //...构造函数不变,代码省略...
  }
  
  public void log(Level level, String mesage) {
    if (!isLoggable()) return;
    // 格式化level和message,输出到消息中间件
    msgQueueClient.send(...);
  }
}

       这个设计思路虽然达到了代码复用的目的,但是无法使用多态特性了。像下面这样编写代码,就会出现编译错误,因为 Logger 中并没有定义 log() 方法。


Logger logger = new FileLogger("access-log", true, Level.WARN, "/users/wangzheng/access.log");
logger.log(Level.ERROR, "This is a test log message.");

       你可能会说,这个问题解决起来很简单啊。我们在 Logger 父类中,定义一个空的 log() 方法,让子类重写父类的 log() 方法,实现自己的记录日志的逻辑,不就可以了吗?


public class Logger {
  // ...省略部分代码...
  public void log(Level level, String mesage) { // do nothing... }
}
public class FileLogger extends Logger {
  // ...省略部分代码...
  @Override
  public void log(Level level, String mesage) {
    if (!isLoggable()) return;
    // 格式化level和message,输出到日志文件
    fileWriter.write(...);
  }
}
public class MessageQueueLogger extends Logger {
  // ...省略部分代码...
  @Override
  public void log(Level level, String mesage) {
    if (!isLoggable()) return;
    // 格式化level和message,输出到消息中间件
    msgQueueClient.send(...);
  }
}

这个设计思路能用,但是,它显然没有之前通过抽象类的实现思路优雅。我为什么这么说呢?主要有以下几点原因。

  • 在 Logger 中定义一个空的方法,会影响代码的可读性。如果我们不熟悉 Logger 背后的设计思想,代码注释又不怎么给力,我们在阅读 Logger 代码的时候,就可能对为什么定义一个空的 log() 方法而感到疑惑,需要查看 Logger、FileLogger、MessageQueueLogger 之间的继承关系,才能弄明白其设计意图。
  • 当创建一个新的子类继承 Logger 父类的时候,我们有可能会忘记重新实现 log() 方法。之前基于抽象类的设计思路,编译器会强制要求子类重写 log() 方法,否则会报编译错误。你可能会说,我既然要定义一个新的 Logger 子类,怎么会忘记重新实现 log() 方法呢?我们举的例子比较简单,Logger 中的方法不多,代码行数也很少。但是,如果 Logger 有几百行,有 n 多方法,除非你对 Logger 的设计非常熟悉,否则忘记重新实现 log() 方法,也不是不可能的。
  • Logger 可以被实例化,换句话说,我们可以 new 一个 Logger 出来,并且调用空的 log() 方法。这也增加了类被误用的风险。当然,这个问题可以通过设置私有的构造函数的方式来解决。不过,显然没有通过抽象类来的优雅。

其次,我们再来看一下,我们为什么需要接口?它能够解决什么编程问题?

       抽象类更多的是为了代码复用,而接口就更侧重于解耦。接口是对行为的一种抽象,相当于一组协议或者契约,你可以联想类比一下 API 接口。调用者只需要关注抽象的接口,不需要了解具体的实现,具体的实现代码对调用者透明。接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码的可扩展性。

       实际上,接口是一个比抽象类应用更加广泛、更加重要的知识点。比如,我们经常提到的“基于接口而非实现编程”,就是一条几乎天天会用到,并且能极大地提高代码的灵活性、扩展性的设计思想。

 

三、如何决定该用抽象类还是接口?

       刚刚的讲解可能有些偏理论,现在,我们就从真实项目开发的角度来看一下,在代码设计、编程开发的时候,什么时候该用抽象类?什么时候该用接口?

       实际上,判断的标准很简单。如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类;如果我们要表示一种 has-a 关系,并且是为了解决抽象而非代码复用的问题,那我们就可以使用接口。从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)。而接口正好相反,它是一种自上而下的设计思路。我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。

 

四、总结

1. 抽象类和接口的语法特性抽象类不允许被实例化,只能被继承。它可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法。子类继承抽象类,必须实现抽象类中的所有抽象方法。接口不能包含属性,只能声明方法,方法不能包含代码实现。类实现接口的时候,必须实现接口中声明的所有方法。

2. 抽象类和接口存在的意义抽象类是对成员变量和方法的抽象,是一种 is-a 关系,是为了解决代码复用问题。接口仅仅是对方法的抽象,是一种 has-a 关系,表示具有某一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高代码的扩展性。

3. 抽象类和接口的应用场景区别什么时候该用抽象类?什么时候该用接口?实际上,判断的标准很简单。如果要表示一种 is-a 的关系,并且是为了解决代码复用问题,我们就用抽象类;如果要表示一种 has-a 关系,并且是为了解决抽象而非代码复用问题,那我们就用接口。

参考:王争 设计模式之美

 

 

 

从零开始了解数据采集(五)——工业通信协议:数据采集的“语言”桥梁 数据采集常用的通信协议有哪一些?看完这篇你就了解了~ 阅读详情

相关推荐

基于STM32的多参数水质检测仪系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配pH、TDS、浊度、水温四大核心水质检测模块,完整实现了多参数水质检测仪的全流程开发,从多通道ADC采集、数字滤波、温度补偿、专业校准、阈值报警到人机交互,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 484

Java抽象类和接口的详细区别(全)

这两者经常在笔试以及面试中经常问及,甚至在项目实战中还在纠结用哪一种类型今天就此问题详细剖析一下以往我的文章中也有稍微提及:java框架零基础从入门到精通的学习路线(超全)此处将其这些文章抽离公共部分,详细总结下这两概念此处的总结偏向于两者概念的总结,将其制作成表格抽象类是半抽象的,有构造方法,只允许出现常量和抽象方法。类和类之间只能单继承,一个抽象类只能继承一个类(单继承)。接口是完全抽象的,没有构造方法,接口和接口之间支持多继承,一个类可以同时实现多个接口比较内容抽象类。

码农研究僧的博客 2万+

WslRegisterDistribution failed with error_ 0x8007019e、0x800701bc、0x80370102

Ubuntu 20.04.4 LTS 报错解决方案。分别涉及到三个错误:WslRegisterDistribution failed with error: 0x8007019e、WslRegisterDistribution failed with error: 0x800701bc和WslRegisterDistribution failed with error: 0x80370102

一起加油~ 5万+

Java入坑之抽象类、设计模式与接口

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。在Java中,接口(interface)是一种抽象类型,它是抽象方法的集合。接口通常用来定义对象的行为。一个类可以实现一个或多个接口,从而继承接口中定义的抽象方法。

qq_62377885的博客 1940

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1026

kettle写doris操作

文件在目录:doris-master\extension\kettle\assemblies\plugin\target\doris-stream-loader-plugins-9.4.0.0-343.zip。官方提供了doris stream load插件,下载源码编译后放到kettle的插件目录即可使用。地址:https://github.com/apache/doris.git。注意:需要doris插件或者kettle转换生成模板的私聊博主。使用PDmaner同步业务库生成建表语句。

weixin_44449054的博客 3031

设计模式、面向对象四:接口和抽象类的区别

参考文献:极客时间,王争 设计模式之美 抽象类 什么是抽象类 以一段经典的抽象类使用场景(模板设计模式)来举例。 Logger是一个记录日志的抽象类 FileLogger和MessageQueueLogger继承Logger 分别实现不同的日志记录:记录日志到文件中和记录日志到消息队列中。 FileLogger和MessageQueueLogger两个子类复用了父类Logger中的na...

圆哥哥纳丶的博客 258

光谱特征选择之模拟退火算法SA

光谱特征选择之模拟退火算法SA。

weixin_42621095的博客 901

接口:比抽象还抽象

接口 比抽象类还抽象的——>接口(隔离实现),抽象类中既可以定义抽象方法,也可以不定义抽象方法,而接口更加抽象,接口中只能定义抽象方法,在JDK1.8的版本中使用default关键字便可以在接口总实现方法 接口不是具体的类,所以实现接口可以在多个具体实现类中进行更换 public interface Car{ public void start(); public void speedUp(); default void speedDown(){System.out.println("减速");

阿楠的博客 2437

2025反爬虫革命:京东商品接口的动态指纹认证与量子加密传输方案

在2025年,全球电商API接口面临的安全威胁呈现指数级增长:京东构建了基于硬件、软件、行为三重维度的设备指纹模型:京东构建了基于BB84+E91混合协议的量子密钥中继网络:

FB13713612741的博客 1649

避坑指南:Allegro 17.2更新封装时遇到的5个典型问题及解决方案(含Symbol报错处理)

本文深度解析Allegro 17.2封装更新过程中的核心机制与常见陷阱。针对“Update Symbols”功能失效、焊盘不匹配、DRC报错、图形层叠错误等5大典型问题,提供从原理分析到实战解决方案的完整指南,帮助用户实现从“更新失败”到“丝滑替换”的平稳过渡。

tgb34567890的博客 1039

Java面试题总结-抽象类和接口的区别

Java面试总结-抽象类和接口的区别

m0_56642224的博客 720

人群仿真软件:AnyLogic_(12).AnyLogic高级功能应用

在AnyLogic中,自定义行人行为是通过编写Java代码来实现的。行人行为的自定义可以包括行走路径的选择、速度变化、交互行为等。这使得仿真模型更加灵活和真实。

kkchenjj的博客 1060

接口 vs 抽象类 的区别

文章目录1. 抽象类2. 接口类3. 如何选择 学习自 极客时间《设计模式之美》 1. 抽象类 2. 接口类 3. 如何选择 表示 is - a 关系,解决代码复用:抽象类(自下而上,子类的代码重复,抽象成上层父类) 表示 has - a 关系,解决解耦问题,隔离接口和具体实现,提高代码扩展性:接口(自上而下,先设计接口,再考虑实现) ...

Michael是个半路程序员 417

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

接口VS抽象类的区别

聊聊接口和抽象类, 我会这么聊:定义、区别(是什么),存在意义(从哪来),应用(到哪去)。 1、定义: 抽象类:不允许实例化,只能被继承;可包含属性和方法,包含抽象方法;子类继承抽象类必须重写抽象方法。 接口:不允许实例化,只能被实现;不包含属性和普通方法,包含抽象方法、静态方法、default 方法;类实现接口时,必须实现抽象方法。 2、意义: 抽象类:解决复用问题,适用于is-a的关系。 接口:解决抽象问题,适用于has-a的关系。 3、应用: 例如: 解决复用问题:java中的子类FileI

Rookie 267

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

接口vs抽象类的区别?

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。 不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口;而像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然

zhujiangtaotaise的专栏 261

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java基础——抽象类 vs接口的联系与区别

【代码】Java基础——抽象类 vs接口的联系与区别。

Future_yzx的博客 415

抽象类vs接口 特点及区别分析

抽象类的作用:作为模板或对共性属性和行为抽象,与子类is-a关系,故抽象类不可以创建对象 抽象类的使用 1.如果子类是一个普通类,要实现抽象父类中的所有抽象方法 2.如果子类是一个抽象类,可以选择性的实现抽象父类中的抽象方法 另外,抽象类还可以继承普通类

Sup星月★然的博客 179

08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

抽象类和接口是面向对象编程中的两个重要概念。抽象类不能被实例化,提供部分方法实现,子类必须实现其抽象方法;而接口不能包含属性,方法没有实现,类实现接口时必须实现所有方法。抽象类表示“is-a”关系,关注代码复用,而接口表示“has-a”关系,注重解耦和扩展性。文章通过Java示例解释了它们的定义与应用,并探讨了抽象类和接口的不同实现方式,如用普通类模拟接口或duck-typing策略。

想起来就更新 796

接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

接口类和抽象类作用 在面向对象编程中,抽象类和接口类是两个经常被用到的语法概念,是面向对象四大特性【封装,抽象,继承,多态】,以及很多设计思想、设计原则、设计模式、编程实现的基础。 使用接口类来实现面向对象的抽象特性、多态特性 使用接口类践行基于接口而非实现的设计原则 使用抽象类来实现面向对象的继承特性 使用抽象类实现模板设计模式等等 并不是所有的预言都支持这两种语法机制,比如C++只有抽象类的...

brucecyc的专栏 270

抽象类VS接口:核心区别与实战选择

文章简介: TDS 是一款基于 .NET 开源免费(MIT license)、高效且用户友好的文件搜索工具,使用 Avalonia UI 技术并完美支持 AOT 编译,实现并优化了如 USN 读取/近实时更新,索引磁盘缓存,索引增强搜索,多关键字匹配,多线程搜索,Avalonia UI 实现(虚拟化,全局热键,系统托盘)等功能,具有轻量高效、界面美观、交互舒适等特性。文章简介: 在 C# 的语法演进中,“弃元(Discard)” 以一个简单的下划线 _ 成为了既提升代码可读性,又优化性能的 “双料特性”。

scshsdsdvad的博客 687

理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

王争《设计模式之美》学习笔记 文章目录理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?什么是抽象类和接口?区别在哪里?首先,我们来看一下,在 Java 这种编程语言中,我们是如何定义抽象类的。刚刚我们讲了如何定义抽象类,现在我们再来看一下,在 Java 这种编程语言中,我们如何定义接口。抽象类和接口的区别抽象类和接口能解决什么编程问题?首先,我们来看一下,我们为什么需要抽象类?它能够解决什么编程问题?其次,我们再来看一下,我们为什么需要接口?它能够解决什么编程问题?如何模拟抽象类和接口两个语法

章全蛋的博客 244

设计模式之美-接口vs抽象类的区别

不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。Java这种编程语言,既支持抽象类,也支持接口,所以,为了让你对这两个语法概念有比较直观的认识,我们拿Java这种编程语言来举例讲解。首先,我们来看一下,在Java这种编程语言中,我们是如何定义抽象类的下面这段代码是一个比较典型的抽象类的使用场景(模板设计模式Logger是一个记录日志的抽象类,FileLogger和继承Logger,分别实现两种不同的日志记录方式:记录日志到文件中和记录日志到消息队列中。FileLogger和。

abc123mma的博客 831

08 | 理论五:接口 vs 抽象类 的区别?如何用普通类模拟抽象类和接口

定义抽象类// 抽象类​if (!// 抽象类的子类:输出日志到文件​@Override// 格式化level和message,输出到日志文件// 抽象类的子类: 输出日志到消息中间件(比如kafka)@Override// 格式化level和message,输出到消息中间件抽象类分析抽象类不允许被实例化,只能被继承。抽象类可以包含属性和方法。

Balance 972

《设计模式之美》理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

王争《设计模式之美》学习笔记 接口vs抽象类的区别? 作者以JAVA举例抽象类: 抽象类不允许被实例化,只能被继承。 抽象类可以包含属性和方法。 子类继承抽象类,必须实现抽象类中的所有抽象方法。 作者以JAVA举例接口: ...

玲珑巫女的学习笔记 300

08丨理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。 不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++这种编程语言只支持抽象类,不支持接口;而像Python这样的动态编程语言,既不支持抽象类,也不支持接口。尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍...

一蓑烟雨任平生 226
上一篇: 封装、抽象、继承、多态分别解决了那些编程问题
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值