在面向对象编程中,接口(Interface)和抽象类(Abstract Class)都是用于实现抽象化的机制,但它们在设计目的、语法规则和使用场景上有显著区别。以下是它们的核心区别:

1. 定义与关键字

  • 接口:用 interface 关键字定义,是一种纯粹的抽象类型,仅声明方法规范(“做什么”),不提供具体实现(特殊情况除外,如Java 8+的默认方法)。
    例:public interface Runnable { void run(); }

  • 抽象类:用 abstract class 关键字定义,是包含抽象方法的类,既可以有抽象方法(无实现),也可以有具体方法(有实现)。
    例:public abstract class Animal { abstract void eat(); void sleep() { ... } }

2. 继承/实现方式

  • 接口:类通过 implements 关键字实现接口,一个类可以同时实现多个接口(支持多实现)。
    例:class Dog implements Runnable, Serializable { ... }

  • 抽象类:类通过 extends 关键字继承抽象类,一个类只能继承一个抽象类(多数语言如Java、C#支持单继承)。
    例:class Dog extends Animal { ... }

3. 方法与实现

  • 接口

    • 早期版本(如Java 7及以前)中,所有方法默认是 public abstract(抽象方法,无实现)。
    • 新版本(如Java 8+)允许定义 default 方法(有默认实现)和 static 方法(静态实现),但核心仍以抽象方法为主。
    • 方法访问修饰符只能是 public(默认)。
  • 抽象类

    • 可以包含抽象方法(用 abstract 修饰,无实现)和具体方法(有完整实现)。
    • 方法访问修饰符可以是 publicprotected 等(但不能是 private,否则子类无法实现)。

4. 成员变量

  • 接口:变量默认是 public static final(常量),必须初始化,且不能被修改。
    例:interface Constants { int MAX = 100; }(等价于 public static final int MAX = 100

  • 抽象类:变量可以是普通成员变量(非静态、非final),也可以是常量,允许被子类继承和修改(根据修饰符)。

5. 构造函数

  • 接口没有构造函数,因为接口不能被实例化,仅用于定义规范。
  • 抽象类有构造函数(用于子类初始化时调用),但抽象类本身不能被实例化。

6. 设计目的

  • 接口
    强调“行为规范”,定义“能做什么”,用于实现多态和解耦。例如,Comparable 接口规定“可比较”的行为,任何类只要实现该接口就能被排序。
    适合表示“不同类之间的共性行为”(如“可飞行”“可序列化”)。

  • 抽象类
    强调“类的继承关系”,定义“是什么”,用于提取同类事物的共同属性和行为。例如,Animal 抽象类包含所有动物的共同方法(如 eat()),子类(DogCat)继承后实现细节。
    适合表示“is-a”关系(如“狗是动物”)。

总结对比表

特性接口(Interface)抽象类(Abstract Class)
关键字interfaceabstract class
继承方式多实现(implements单继承(extends
方法实现主要是抽象方法,可含默认方法(Java 8+)可混合抽象方法和具体方法
成员变量只能是 public static final 常量可包含普通变量、常量
构造函数有(供子类调用)
设计意图定义行为规范(“做什么”)定义类的模板(“是什么”)

如何选择?

  • 若需要定义一组不相关类的共同行为(如“可打印”“可比较”),用接口
  • 若需要提取同类事物的共同属性和部分实现(如“动物”“形状”),用抽象类
  • 若既需要继承共性实现,又需要实现多行为规范,可同时使用(类继承抽象类 + 实现多个接口)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94736.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94736.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94736.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql系列--11、使用c/c++访问mysql服务

目录 一、准备 测试 二、创建对象 三、连接Mysql服务 四、下达指令 3.1增删改 增加 编码格式 删除 修改 3.2查询结果 结构体理解 打印属性 打印数据 前面我们已经学习并练习了本地命令行形式的sql语句的使用,可在以后开发中我们一般 不会直接命令行操作数据库&…

CS144 lab3 tcp_sender

0. 前言 这个实验做了挺久的,刚开始做的时候官方的代码库还是开着的。 调着调着代码官方把仓库给删掉了,又去找别人的代码仓库调发现不 对都打算放弃了,过了几天发现了一个start-code的库 再合进去简直完美。这个实验花的时间应该是前四个里面…

华为HCIP数通学习与认证解析!

大家好,这里是G-LAB IT实验室。在信息技术飞速发展的今天,随着华为产品和服务的广泛应用,成为一名华为数通工程师无疑是许多年轻从业者的目标。然而,对于许多人来说,面对令人眼花缭乱的华为认证体系,不禁要…

深度学习入门Day10:深度强化学习原理与实战全解析

一、开篇:智能决策的科学与艺术在前九天的学习中,我们掌握了处理各种数据类型的深度学习方法,但这些都属于"被动学习"——模型从静态数据中学习模式。今天,我们将进入一个全新的领域:强化学习(Re…

Jenkins Pipeline(二)-设置Docker Agent

设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。 1.安装必要插件 在Jenkins服务器上已经安装了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么,再次检查并安装即可。 2. 配…

神经网络|(十六)概率论基础知识-伽马函数·中

【1】引言 前序学习进程中,已经初步了解了伽马函数,认识到nnn的阶乘计算可以转化为: n!n!⋅limk→∞kn⋅k!(nk)!limk→∞kn⋅k!⋅n!(nk)!limk→∞kn⋅k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

设计模式Books Reading

文章目录 设计模式 创建型设计模式 工厂方法 示例说明 工厂方法模式结构 案例伪代码 工厂方法模式适合应用 实现方式 工厂方法模式优缺点 与其他模式的关系 概念示例 抽象工厂 抽象工厂模式结构 抽象工厂模式适合应用场景 实现方式 抽象工厂模式优缺点 与其他模式的关系 代码示…

接吻数问题:从球体堆叠到高维空间的数学奥秘

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 接吻数问题概述 接吻数问题(Kissing Number Problem&am…

深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】

文章目录先言1. 卷积核:特征检测的魔法窗口1.1什么是卷积核:可学习的特征检测器1.2可视化理解:边缘检测、纹理提取、特征发现1.3代码实现:使用PyTorch定义和初始化卷积层2. 卷积运算的数学原理2.1.离散卷积计算:滑动窗…

当不想安装telnet或nc时,可使用 Linux 系统默认自带的bash原生网络功能或ping(辅助判断)测试连通性

1. 用bash原生/dev/tcp测试端口(无需任何工具)bashshell 内置了/dev/tcp虚拟设备,可直接通过脚本测试端口是否能连接,执行以下命令(替换数据库 IP 和端口):# 格式:echo > /dev/tc…

【STM32外设】ADC

声明:上图是STM32产品型号各字段含义,本文基于STM32F103 1、ADC的一些概念 常规通道(常规组)和注入通道(注入组)(regular channels and injected channels)ADC支持的外部通道总共16个(且被3个ADC共享,ADC12…

Aha Moment——啊哈时刻!

1. 理解面试官的意图面试官问你“Aha moment”,其实是想知道:你是否真正理解这个概念:不只是背定义,而是理解其为什么重要。你如何发现它:考察你的数据分析方法论和技术能力(用了哪些数据、指标、模型&…

RAG教程5:多表示索引和ColBERT

文章目录 导入依赖包 多表示索引 ColBERT 导入依赖包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

来自火山引擎的 MCP 安全授权新范式

资料来源:火山引擎-开发者社区 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 开放生态下的 OAuth 授权安全挑战,并系统阐述火山引擎为此构建的多层次、纵深防御安全方案。面对由 OAuth 2.0 动态客户端注册带来的灵活性与潜在风险,…

瑞芯微RK3506开发板PWM输入捕获驱动调试记录

本文演示PWM输入信号采集,基于触觉智能RK3506开发板。配置为: 3核Cortex-A7Cortex-M0多核异构处理器 主要接口:2路CAN FD,5路串口,RGB、MIPI、音频、USB2.0 OTG等、板载双百兆网口4G星闪SLEWiFi6BLE5.2。 PWM信号简…

PHP的header()函数分析

PHP的header()函数是HTTP协议交互的核心工具,它通过直接操纵响应头实现服务器与客户端之间的元数据通信。作为PHP原生函数,其设计初衷是处理HTTP协议层的关键操作,包括状态码设置、内容类型声明和缓存控制等基础功能。在Web开发中&#xff0c…

根据并发和响应延迟,实现语音识别接口自动切换需求

根据并发和响应延迟,语音识别接口自动 切换需求 需求描述: 当请求的语音识别的请求数量大于3或者请求语音识别接口3秒不可达无响应,切换备用语音识别接口 科大讯飞语音识别作为备用接口 科大讯飞的API文档: 进入讯飞开放平台的网页&#…

程序员之电工基础-CV程序解决目标检测

一、背景 兴趣爱好来了,决定研发一个产品。涉及到电工和机械等知识,所以记录一下相关的基础知识。今天的内容又回到了我的主营板块!!哈哈!!为后续整体集成做准备,先测试目标检测部分的能力。 二…

B树的概述以及插入逻辑

一,B树的概述1.B树(B-树)又称多路平衡查找树,B树所有节点中孩子数量的最大值n称为B树的阶,通常用m表示比如当m为2就是常见的二叉树一颗m阶的B树定义如下:1)每个结点最多有m-1个关键字;2)根节点最少可以只有1个关键字;3…

如何用 Kotlin 在 Android 手机开发一个小闹钟、计时器、秒表

以下是在 Android 上用 Kotlin 开发小闹钟、计时器和秒表的方法,分为核心功能实现和界面设计两部分: 闹钟功能实现 AlarmManager 和 BroadcastReceiver // 设置闹钟 val alarmManager getSystemService(Context.ALARM_SERVICE) as AlarmManager val i…