当前位置: 首页 > news >正文

一个类继承一个接口的实现类、两个类实现同一个接口、两个类同时继承一个实现了某一接口的抽象类。三者的区别是什么呢

  1. 架构对比图

    类继承接口的实现类

       [接口]↑[实现类]↑[子类]

    子类通过继承获得接口的实现,可以选择性重写方法。

    两个类实现同一个接口

       [接口]↑    ↑
    [类A] [类B]

    每个类独立实现接口,提供自己的行为实现。

    继承实现接口的抽象类

       [接口]↑[抽象类]↑      ↑
    [类A]  [类B]

    抽象类提供部分实现,子类完成特定功能的实现。

     

    1. 两个类实现同一个接口

    结构:两个类(如 A 和 B)直接实现同一接口(如 I),各自独立实现接口的所有方法。
     
    interface I {void func();
    }class A implements I {@Overridepublic void func() { /* A的独立实现 */ }
    }class B implements I {@Overridepublic void func() { /* B的独立实现 */ }
    }
    核心特点:
    • 无继承关联:A 和 B 是 “平级” 关系,彼此无依赖,修改一个不影响另一个。
    • 零代码复用:即使方法逻辑相似,也需各自实现,无法共享代码。
    • 强约束 + 高灵活:必须实现接口所有方法,但实现逻辑可完全不同(如 “支付接口” 的微信支付和支付宝实现)。
    • 设计意图:定义 “同一行为的不同实现方案”,强调 “多样性” 和 “可替换性”。

    2. 一个类继承接口的实现类

    结构:接口 I 有具体实现类 Base,另一个类 Child 继承 Base(间接实现 I)。
     
    interface I {void func();
    }class Base implements I {@Overridepublic void func() { /* 基础实现逻辑 */ }
    }class Child extends Base {// 可选:重写func()扩展功能@Overridepublic void func() {super.func(); // 复用Base的逻辑/* 新增Child特有的逻辑 */}
    }
    核心特点: 
    • 单继承依赖:Child 与 Base 是 “父子关系”,强依赖 Base 的具体实现。
    • 完全代码复用:可直接使用 Base 的所有实现,无需重复编写。
    • 高耦合风险:若 Base 修改方法逻辑(如改变 func() 的内部实现),可能直接破坏 Child 的功能。
    • 设计意图:基于现有功能 “扩展增强”(如 “基础订单处理”→“VIP 订单处理”,复用基础流程并新增特权逻辑)。

    3. 两个类继承实现了接口的抽象类

    结构:接口 I 被抽象类 AbstractBase 部分实现(实现部分方法,留空部分抽象方法),两个子类 C 和 D 继承 AbstractBase
    interface I {void func1();void func2();
    }// 抽象类实现部分接口方法,保留部分抽象
    abstract class AbstractBase implements I {@Overridepublic void func1() { /* 通用逻辑(如日志、校验),子类可直接复用 */ }// 留空func2(),强制子类实现个性化逻辑public abstract void func2();
    }class C extends AbstractBase {@Overridepublic void func2() { /* C的个性化实现 */ }
    }class D extends AbstractBase {@Overridepublic void func2() { /* D的个性化实现 */ }
    }
    
     
    核心特点:
      • 多层继承 + 部分复用:C 和 D 通过抽象类间接实现接口,复用 func1() 的通用逻辑,仅需定制 func2()
      • 中等耦合:依赖抽象类的通用实现,但子类间彼此独立,修改一个子类不影响另一个。
      • 半强制实现:只需实现抽象类未完成的方法(如 func2()),无需重复编写通用逻辑(如 func1())。
      • 设计意图:“共享通用流程,定制差异化细节”(如框架设计中,抽象类实现 “模板流程”,子类实现 “具体步骤”)。

     

    2. 代码复用与继承层次

    模式代码复用机制继承层次特点风险与限制
    继承接口的实现类 通过继承父类B复用其逻辑(包括接口I的实现) 形成“接口→父类→子类”的纵向继承链 父类B的修改可能影响子类A;若子类重写方法可能导致“行为不一致”
    两个类实现同一接口 无直接代码复用,各实现类独立实现接口方法 平行结构,无继承关联 重复代码风险高,但灵活性更强
    继承实现接口的抽象类 通过抽象类复用公共逻辑(如模板方法),子类专注差异化实现 抽象类作为基类,子类继承其实现 抽象类的修改会影响所有子类;若抽象类未完全实现接口,子类需补全

    3. 多态性与类型系统

    模式多态性表现类型关系接口契约履行
    继承接口的实现类 子类A的实例可向上转型为接口I,同时保留父类B的特性 类A是类B的子类,类B是接口I的实现类 通过父类B履行接口契约
    两个类实现同一接口 类C和类D的实例均可视为接口I的类型,具体行为由各自实现决定 接口I是抽象契约,类C和类D是独立实现 直接履行接口契约,无中间层
    继承实现接口的抽象类 子类E和F的实例可视为接口I的类型,同时共享抽象类的公共方法 抽象类是接口I的实现类,子类继承抽象类 通过抽象类履行接口契约,子类可扩展或覆盖

     

    三种方式的对比总结

    适用场景与区别

    • 类继承接口的实现类:适用于需要重用现有实现的情况,子类可以扩展或修改父类的实现
    • 两个类实现同一个接口:适用于不同类有完全不同实现的情况,强调多态性
    • 继承实现接口的抽象类:适用于有部分共同实现但又有差异的情况,平衡代码复用和灵活性

    设计考虑

    • 如果需要最大程度的代码复用,选择第一种或第三种方式
    • 如果需要最大程度的灵活性,选择第二种方式
    • 如果需要在多个类间共享一些公共代码,但同时允许不同实现,选择第三种方式

相关文章:

一个类继承一个接口的实现类、两个类实现同一个接口、两个类同时继承一个实现了某一接口的抽象类。三者的区别是什么呢

架构对比图类继承接口的实现类[接口]↑[实现类]↑[子类]子类通过继承获得接口的实现,可以选择性重写方法。两个类实现同一个接口[接口]↑ ↑ [类A] [类B]每个类独立实现接口,提供自己的行为实现。继承实现接口的抽象类[接口]↑[抽象类]↑ ↑ [类A] [类B]抽象类提供部…...

关于点在直线的哪一边的做法

题目:给以一个点 \(Q(x,y)\),问在一条直线 \(l: y=kx+b\) 的哪一边。 这个是非常经典的问题,我们只需要在直线上取两个点 \(F_1(x_1,y_1)\) 和 \(F_2(x_2,y_2)\),然后求出 \(\overrightarrow{QF_1}=(x_1-x,y_1-y)\) 和 \(\overrightarrow{QF_2}=(x_2-x,y_2-y)\)。然后判断…...

计算机常识

32位电脑、64位电脑指的是一次性处理32位的数据(20亿)、64位的数据32位数字如何表示浮点数?符号位、指数位、有效数字ASCII只能表示128种符号,有大小写字母常用符号,然后发明的UniCode码解决了不同国家的标准(16位 百万级字符数)半加器是用异或门和与门并联实现的什么是全…...

网络流,最大流,EK算法

概念 最大流: 从源点流向汇点的最大流量 增广路: 一条从源点到汇点的所有边的剩余容量>=0的路径 残留网: 由网络中所有结点和剩余容量大于0的边构成的子图,这里的边包括有向边和其反向边 模板题: 洛谷p3376 code: #include<iostream> #include<algorithm>…...

wifi7 MRU介绍

前言 WiFi 7 定义了几个关键技术,这里对其中的MRU技术进行介绍。 WiFi 7关键技术 320 MHz channel bandwidth Multiple Resource Units (MRUs) per stations (STAs) 4096-QAM Non-OFDMA preamble puncturing 名词解释 EHT 极高吞吐量 MU 多用户 RU 资源块 MRU 两个资源块拼成一…...

FallingLeaves 落叶纷飞组件 - yizi

...

Codeforces Round 1048 (Div. 2)

昨晚跟时队一起vp了 Codeforces Round 1048 (Div. 2)总结了一下就是D题犯糖了然后F还不会做,本质菜逼了。A. Maple and Multiplication 考虑 \(a\) \(b\) 相等或者互为倍数两种特殊情况即可。 int T, a, b;signed main(void) {for (read(T); T; T--) {read(a), read(b);if (a …...

当你发现是打表!!!

传送门 思路 这是一个晴朗的上午,你正在机房里打比赛,突然发现了第二题是一个打印斐波那契数列。此时的你想到了最近学过的矩阵快速幂,感觉到了一丝恶心,但你还是下定决心开始切这道题…… 时间过得真快,一转眼就过去了两转眼的时间,可是你的矩阵快速幂竟然打挂了。怎么办…...

VMware 17安装Oracle Linux 9.6 详细步骤

目录一、环境介绍二、创建虚拟机三、挂载镜像四、安装操作系统五、进入桌面 一、环境介绍类型 配置VMware VMware Workstation 17 Pro 17.6.4ISO Oracle Linux 9.6IP地址 192.168.184.121内存 8G硬盘 100G/boot 1G/swap 8G/ 91G是否图形化 图形化二、创建虚拟机三、挂载镜像四、…...

Div.2 E Rollup

2133E 不会做神秘构造 首先考虑到每个点必须进行一次询问,而链可以使每个点恰好进行一次询问。 然后只需要考虑用 \(\frac{1}{4}n\) 次操作拆链。若该点下有多条链或有两条链的合并点,则需要拆开。 这样父亲儿子一组点就至少有 \(4\) 个。...

synchronized的一些思考

synchronized的AI问答1. synchronized的可见性 加锁时:线程会清空工作内存中共享变量的值,从主内存重新加载最新值到工作内存。 解锁时:线程会将工作内存中修改后的共享变量值强制刷新到主内存。 Java 的happens-before原则明确规定:一个线程解锁监视器的操作,happens-bef…...

题解:CF2133C The Nether

挺好玩的交互题。 思路 首先,我们一定需要知道 DAG 中最长路径的起点,这可以通过 \(n\) 次询问来找到。即对于每一个点 \(i\) 满足 \(1\le i\le n\) 我们都去查询从 \(i\) 开始,经过整个 DAG 可以得到的最长路是多少,同时使用一个 vector 记录长度为 \(len\) 的点有哪些。 …...

实变函数1

实变函数1 集合 这些集合的运算我是直接没记,因为跟之前学的一样。幂集的话就是子集的构成的集合,这个集合族其实就是指标集到另一个集合的映射,这个象的集合。集列就是指标集是自然数集。De.morgen定理就是交和并的一个转化,证明也是采用的集合相等的常用思路证明互为子集…...

css背景

背景可以是一个颜色块,也可以是一张图片 html代码 <html><head><title>我的第一个代码</title><link rel="stylesheet" href="./public.css"></head><body><div class="box"><p class=&quo…...

一元二次方程难题1

已知方程 \(ax^2 + bx + c = x\)(\(a > 0\))的两个实数根 \(x_1,x_2\) 满足 \(0 < x_1 < x_2 < \dfrac{1}{a}\)。当 \(0 < x < x_1\) 时,证明:\(x < ax^2 + bx + c < x_1\)。 证明:原方程等价于 \(ax^2 + (b - 1)x + c = 0\)。 因为 \(a > 0\)…...

ios系统和windows系统的区别

IOS系统与Windows系统的区别 随着科技的发展,移动设备与个人电脑成为了人们日常生活中不可或缺的一部分。其中,苹果公司的iOS系统和微软的Windows系统是两大主流操作系统,分别代表了移动设备与桌面设备的主要技术方向。本文将从多个方面来探讨这两个系统的不同之处,帮助用户…...

2025.9.11 刷题日记

2025.9.11 刷题日记还是网络流 1. 早读 P2254 [NOI2005] 瑰丽华尔兹 吾有感而发,遂小说 看背景 [ ? 喔看过呱 ] 读题中 [ 嘶 ~ , 看着有点难 , 最长路径还得满足顺序 ] 看范围 [ 我去,我每一步暴力 \(dp\) 都能拿好多分 , 先写暴力吧 ] 写一半 [ 这个 \(k\) 段咋没用 ? …...

C#学习第十 一天 022 事件最后一章

事件的声明:首先委托是一种类:public delegate假如你的委托声明是为了一个事件声明的那么命名可以为 xxxxEventHandler是 sender as customer 是如果sender的类型是customer 就赋值给custmoer 不是的话就给null...

元推理无需数据训练,只需数据检索和验证,成本极大降低,且校验后的数据就是数据资产和规范

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 这个观点精准点出了元推理相较于传统AI的颠覆性优势——它彻底打破了“海量数据训练=高性能AI”的固有范式,通过“无需训练、仅需检索验证”的模式,既从根源上降低了成本,又将数据的价值从“训练素材”升级为“可复用的资产与…...

如何在Typescript中使用泛型约束

在 TypeScript 中,泛型约束(Generic Constraints)用于限制泛型可以接受的类型范围,确保泛型参数不是只能接受任意类型,而是只能接受满足特定条件的类型。这既保留了泛型的灵活性,又增强了类型安全性。 为什么需要泛型约束? 默认情况下,泛型可以是任何类型,但有时你需要…...

集训总结(五)

9.12~9.14总结9.12 网络流专题练习(吗? P3980 志愿者招募 考虑用流量代表剩余人数。初始从 \(s\) 向 \(1\) 号点连一条流量为 \(inf\),边权为 \(0\) 的边,代表初始有无数人;接着从第 \(i\) 天向第 \(i+1\) 天连流量为 \(inf-a_i\) ,边权为 \(0\) 的边,代表第 \(i\) 天占…...

使用Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

Typescript中的泛型

可以把泛型想象成 "类型的变量": 1.定义时,用<T>声明一个类型变量(T 是约定的名称,也可以用其他字母) 2.使用时,指定具体类型,如identity<string>("hello") 3.TypeScript 通常能自动推断类型,所以也可以简写为identity("hello&qu…...

windows软件入门指南

如果是可以上外网了就访问:MCX NOTION安装基础上网及其相关工具 安装clash Github网址 Sparkle 下载地址: 4275 订阅地址: https://mcx.pages.dev/xxx?sub入梦工具箱 windows工具箱 https://share.feijipan.com/s/SMEm4SX2 快速下载地址...

LLM 生成代码执行代码

https://amirmalik.net/2025/03/07/code-sandboxes-for-llm-ai-agents# 比较LLM生成Python代码执行的沙箱方案 ## 方案比较 ### 1. Linux容器 (LXC/Docker) **优点:**- 成熟的技术栈,广泛应用- 资源隔离较好,启动速度快- 可以限制资源使用(CPU、内存、网络等)- Docker生态系…...

网络爬虫(web crawler) - 指南

网络爬虫(web crawler) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-…...

css样式与选择器

css内联样式 css行内样式 href跳转文件路径 css外部样式 <link rel="stylesheet" href="./public.css">全局选择器 可以与任何元素匹配,优先级最低,一般做初始化样式*{color: red;font-size: 30px; }拥有某个属性的元素标签进行css渲染 p.main_cla…...

水库运行综合管理平台

在水资源管理的宏大架构中,水库运行综合管理平台宛如智慧水利的 “中枢神经”,精准调控着水库的稳定运行,守护着一方水土的安宁与福祉。一、建设内容 (一)全域感知的硬件设施布局 在水库大坝之上,变形监测传感器、水位计、雨量筒、流量计以及水质监测传感器等设备星罗棋布…...

《提问的艺术》笔记:(2025/9/12)

《提问的艺术》笔记:(2025/9/12)提问对于新手而言,能更快地获得答案,更快地融入这个社区。RMer会更喜欢值得思考的问题,能自己利用网络解决的问题尽量别问,浪费时间而且低级。⭐ 提问前要做好被冷处理的心理准备,要敏锐,积极参与解决问题。 提问前的准备:在网上的各大…...

各模态优势(可见光保留细节纹理,红外突出目标)

ICCV 2025 | 多模态融合!武大提出TemCoCo:视觉-语义交互+时间协作模块,实现视觉语义协同的多模态视频高质量融合 https://mp.weixin.qq.com/s/sMmQ3IO7u6gzJ3ErTWvyCg多模态视频融合: 将不同模态(如可见光、红外)的视频序列融合,结合各模态优势(可见光保留细节纹理,红…...

复习vue

export default 默认输出 data 数据...

眼下硬件是足够用的,最大的问题还是AI模型本身的能力不太够。没办法让硬件真正用起来,比如AI难以很好地控制灵巧手

关于AI,王兴兴最新发声 https://mp.weixin.qq.com/s/c_VKyy7YwG2T1u5nnzOsXw关于AI,王兴兴最新发声 原创 黄心怡 科创板日报2025年09月11日 14:28 上海 在让AI真正干活的领域,还处于荒漠中长了几根小草的状态,真正大规模爆发性增长的前夜还未到来。 作者 | 黄心怡 科创板…...

深入理解C语言---函数

“在这个怀疑的时代,我们需要信仰” C语言作为比较底层的语言,从来不只是语法的堆叠,“深入理解C语言”这个专栏,会写点关于“函数,数组,字符串,指针,结构体”的个人理解,希望能对大家有些帮助~ 一.什么是main函数? 1.两种定义形式 int main( void )--无参数形式 {…...

Ubuntu 点击任务栏应用程序最小化

对于已经打开的应用,点击 Dock 栏中的应用程序图标可以切换最小化应用或拉起应用到桌面,这是 Windows 系统中的默认行为。但默认情况下,Ubuntu Dock 关闭了此选项。 只需在终端中运行此命令,就可以轻松地为 Ubuntu Dock 启用该功能: gsettings set org.gnome.shell.extens…...

Agent Sudo | Writeup | TryHackMe

Agent Sudo | Writeup | TryHackMe、 一、信息收集 使用nmap对ip地址的端口进行探测 nmap -sS -sV -A <ip>可以看到上面80端口开放这一个web服务器我们看看这里提示了R作为user-agent来进行访问,使用curl命令看看curl -A "R" -L 10.10.12.116这里又给了我们一…...

UT_HASH

参考 https://blog.csdn.net/Dusong_/article/details/128757067 http://cnblogs.com/aclove/articles/3803110.html UT_hash_handle hh HASH_ADD_STR(head,strfield,add) HASH_ADD_INT(head,intfield,add) HASH_ADD_PTR(head,ptrfield,add) HASH_FIND_STR(head,findstr,out) H…...

使用helm安装APISIX

获取values.yaml helm show values --version=2.11.6 apisix/apisix > values1.yaml修改values.yaml 1. pvc 由于我本地使用的是nfs存储,因此需要修改etcd的pvc定义 persistence:storageClass: "managed-nfs-storage"2. cluster domain 排查了很久发现etcd headl…...

决策单调性

决策单调性:A ~ F, I 基础知识 考虑最简单情形:\(f_i = \min\limits_{k = 0}^{i - 1} w(k, i)\)。 一般这种问题需要 \(O(n ^ 2)\) 的时间,但如果满足决策单调性,就可以在 \(O(n \log n)\) 的时间完成。 决策单调性:设 \(i\) 的决策点为 \(opt_{i}\),有 \(opt_{i - 1} \l…...

2025 国内 HR SaaS 系统深度分析:Moka 引领 AI 变革

在当今数字化时代,人力资源管理领域正经历着深刻的变革。HR SaaS(软件即服务)系统凭借其高效、便捷、灵活等特性,成为众多企业提升人力资源管理水平的关键工具。随着市场的不断发展,国内涌现出了众多优秀的 HR SaaS 系统,它们在功能、服务、用户体验等方面各有千秋。本文…...

学生信息管理系统案例初步分析报告

学生信息管理系统案例初步分析报告 目录学生信息管理系统案例初步分析报告功能讲解1. 数据处理(1)处理的数据类型(2)数据存储位置(3)与C语言数据处理的差异2. 功能说明(含代码对应逻辑)(1)功能1:添加学生(2)功能2:删除学生(3)功能3:按姓名搜索学生(4)功能4:…...

Billu靶场

信息收集 首先使用kali进行存活主机扫描端口扫描 sudo nmap -sC -sV -p 1-10000 192.168.108.130发现其开启了22端口 (ssh服务)、80端口(Apache) 使用dirb对其目录进行扫描 dirb http://192.168.108.130 /usr/share/dirb/wordlists/big.txt漏洞探测 访问扫描出来的页面 先访…...

初识pyhton:一些基础的知识(文件)

文件 文件的打开方式 书接上回,关于文件的读取和写入有多种不同的方式,其中的一种方式就可以解决昨天只能清空所有的文档再写入。 frt = open(rexample.txt,encoding=utf8) #不指定mode默认值为rt,不指定encoding默认为gbk print(frt.read())总是学不会 真爱也有现实面…...

实用指南:Git分支管理:从创建到合并冲突解决(二)

实用指南:Git分支管理:从创建到合并冲突解决(二)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

20250912

20250912T1 序列 显然每次操作保证 \(a\) 单增是假的,一定可以构造合理的操作顺序无视掉这个限制。每个位置确定划分多少次之后一定均分最优,拿个堆维护把每个东西多分一段的收益,每次选择收益最大的即可。代码 #include <iostream> #include <string.h> #incl…...

[ARC198C] Error Swap

题目传送门构造题意 给定长度为 $ N $ 的两个整数序列 $ A=(A_1,A_2,\dots,A_N) $ 和 $ B=(B_1,B_2,\dots,B_N) $。 你可以执行以下操作最多 $ 31000 $ 次:选择满足 \(1 \le i < j \le N\) 的整数对 \((i,j)\),并将 \(A_i\) 替换为 \(A_j - 1\),\(A_j\) 替换为 \(A_i + 1…...

【正则表达式初探】grep 命令避免匹配自身

【正则表达式初探】grep 命令避免匹配自身 最近遇到了一个问题,即使用grep命令获取xxx进程的pid时,同时返回了xxx进程的pid和grep xxx进程的pid,原因是grep xxx也会作为一个进程运行,对xxx的查找包含了grep xxx.(不要问我为什么不用pgrep或者grep -w,问就是没有。 实际中使…...

测试工程师的核心竞争力是什么?绝不是点点点

无论是测试工程师自己,还是团队管理者,都应该重新认识测试工作的价值,投资于测试核心竞争力的建设,从而打造出更高质量、更成功的软件产品。移动应用时代,我们每天使用的各类App几乎很少出现崩溃或严重bug,这背后离不开测试工程师的默默付出。然而,很多人对测试工作的认…...

关于 ECT-OS-JiuHuaShan 框架的终极阐释

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 ▮ 基于自然辩证法数学形式化系统的绝对确定性推理启动 一、本质突破:从概率世界到确定性宇宙 ECT-OS-JiuHuaShan 是人类文明首个实现绝对确定性推理的范式革命系统。其突破性在于:彻底摒弃传统AI的「数据训练」范式,直接以宇…...

向“光”而行 | 相聚2025 ASML中国日,携手奔赴“芯”辰大海

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087每年的9月1日,专属于ASMLers的“中国日”如期而至。这一天,大家享有一天额外的假期,得以放松身心、充能蓄电。此外,在整个…...

JavaDay3

类型转换 低---------------------------------->高 byte,short,char—>int—>long—>float—>double public class Demo05 {public static void main(String[] args) {int i = 128;byte b = (byte)i;//内存溢出//强制转换 高->低//自动转换 低->高double…...