假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。
Part1.是类在使用接口
当学习接口时,很多人都会告诉你“是类在使用接口”。但是我们观察接口的运用方式,会发现我们常常是用接口类型的变量来接收类的实例,并使用类中的具体方法。这不禁让我们产生疑问:到底是接口在使用类,还是类在使用接口?
先说结论:“是类在使用接口”,而不是接口在使用类。下面由我来为大家揭示控制反转的微妙之处。
一. 表象:为什么“看起来像接口在使用类”?
1. 代码的直观表现
当用接口类型的变量调用方法时,代码的书写形式确实像是“接口在操作类”:
// 接口类型变量
Flyable obj = new Bird();
obj.fly(); // 看似接口调用了 Bird 的方法
这里 Flyable 类型的变量 obj 调用了 fly() 方法,而实际执行的是 Bird 类的实现。这种写法容易让人产生“接口主动使用类”的错觉。
2. 直觉误区来源
-
语法焦点:代码的书写顺序(先声明接口变量,再调用方法)暗示了“接口是主语”。
-
隐藏动态绑定:编译时只知道
obj是Flyable类型,但运行时实际调用哪个类的fly()是动态决定的。这种“延迟绑定”掩盖了类的主动性。
二. 本质:假面与演员。。
1. 接口是“面具”,类是“演员”
接口类型的变量更像是一个角色标签。它不关心背后具体是哪个类,只关心这个类是否“戴上了面具”(实现了接口)。观众们(我们)看到并记住的是这个假面(接口),真正在表演的是演员(类)。
真正的执行者是类自身的方法:
// 逻辑拆解:
Flyable obj = new Bird(); // 类主动“戴上面具”(实现接口)
obj.fly(); // 面具下的演员(Bird)在表演
2. 接口的“被动性”
在运行时,JVM/编译器会根据对象实际类型调用对应方法,与接口无关。
接口没有能力“主动使用”任何类,它只是:
-
定义规范:列出需要实现的方法清单。
-
提供类型标识:允许其他代码以统一的方式操作不同类。
三. 纠正思维:重新理解主动权!
1. 类才是行为的拥有者
接口只是强制类公开某些能力,但能力的具体实现完全由类决定。
例如:
interface Weapon {void attack();
}class Sword implements Weapon {public void attack() { System.out.println("挥剑"); } // 类的主动性
}class Gun implements Weapon {public void attack() { System.out.println("开枪"); } // 类的主动性
}
无论是 Sword 还是 Gun,它们的 attack() 逻辑由类自身定义,接口无法干预。
当通过接口调用方法时,本质是其他代码(如调用方)通过接口的抽象层间接使用类,而非接口本身在操作类。例如:
// 一个外部系统通过接口调用类
class GameEngine {void useWeapon(Weapon weapon) {weapon.attack(); // 实际调用 Sword.attack() 或 Gun.attack()}
}
这里
GameEngine是主动调用者,接口只是传递调用的媒介。
2. 生活类比修正
假设你是一个餐厅老板,你定义了一份“厨师岗位职责”(接口):职责要求:会做菜、会清洁厨房。
而具体的厨师 (类):张三、李四各自以自己的方式实现这些职责。
当顾客点菜时,他们通过“厨师岗位”这个抽象概念获得服务,但实际做菜的是张三或李四。岗位职责(接口)没有能力做菜,它只是确保张三李四具备做菜能力。
四、总结
你的困惑揭示了编程中“控制反转”的微妙之处:
直觉认为:接口是“控制者”(因为它规定了类必须做什么)。
实际逻辑:接口是“被控制者”(类通过实现接口,主动向外界暴露能力)。
这种反直觉的设计恰恰是面向对象编程的威力所在——通过抽象层解耦调用方和实现方,让系统更灵活。理解这一点后,你会意识到:不是接口在使用类,而是类通过接口向 外界 宣告“我能做什么”。
Part2. 编程接口与物理接口的区别
关于接口的知识,我们可能还有一些疑惑之处:
在java中,类如果实现了接口,那么接口类型的变量就可以操控对象的函数执行,感觉像是接口和对象在互动,一共有两个角色;而物理上的接口,比如可以用鼠标操控电脑,这就感觉是对象1与对象2在互动,它们之间的USB接口是互动的桥梁,这之中一共有三个角色。
为什么我们看到的只有接口和对象在互动?编程接口与物理接口的区别又是什么?
一、两者模式?三者模式!
接口作为规范,约束了对象必须提供哪些方法,但不参与实际交互过程。动态绑定机制隐藏了接口的被动性,让你感觉是接口和对象在“互动”的两者模式,但实际是对象在主动向外界提供服务。
在编程中,完整的交互确实涉及三个角色,它们分别是对象、接口、外界。其中外界既可以是我们这种调用者,也可以是其他调用该方法的代码。
以刚刚“生活类比修正”的比喻为例,编程接口就相当于一张岗位招聘,类就相当于具体的厨师,食客就是此处的外界。厨师按照招聘要求前来工作,做好菜品给食客品尝也展示了自己的实力。
三者的交互逻辑:(编程接口)
-
对象通过接口向外界宣告能力
类实现接口时,相当于对象对外界宣告:“我能提供这些服务!”(如Bird实现Flyable接口后,宣告自己能飞)。
主动性:对象的实现是服务提供的基础。 -
外界通过接口使用对象
调用方(外界)无需知道对象的具体类型,只需依赖接口定义的方法(如void makeItFly(Flyable flyableObj))。
间接性:接口作为“中间人”确保调用的合法性,但不参与实际执行。 -
接口作为契约约束双方
-
对对象:必须实现接口方法。
-
对外界:只能调用接口定义的方法。
-
交互流程图:
外界(调用方) —— 通过接口 ——→ 对象↑ ↓←— — 实际执行结果 —— ←—
二、核心区别
我们再来看一下物理接口的三者模式:
-
参与者:设备A(如鼠标)、设备B(如电脑)、接口标准(如USB协议 + 物理接口)。
-
互动逻辑:
物理接口是独立存在的中间层,它同时包含:-
逻辑规范:定义数据传输格式(如USB协议规定电压、信号时序)。
-
物理实体:接口形状(如Type-C插头)、线缆、电路。
设备A和B必须共同遵守接口规范,并通过物理接口交换数据。此时接口既是“约束者”又是“传输通道”。
-
编程接口和物理接口都有约束的作用,为什么只有物理接口有信息传输的职责?(编程接口与物理接口的核心区别):
1. 抽象层次的分离
-
编程接口:属于纯逻辑层,仅通过代码约定行为,无需物理载体。
-
物理接口:需要逻辑与物理的统一,既要定义交互规则(如协议),又要实现物理信号传输。
2. 交互复杂性的需求
-
物理设备间的交互需要严格的兼容性(如电压匹配、插头尺寸),因此必须通过独立的接口层协调。
-
编程中的接口即便隐藏了外界角色的存在,也足够支撑多态性。
3. 设计目标的差异
-
编程接口:目标是解耦(调用方无需关心具体实现类)。
-
物理接口:目标是互联(让不同设备能够物理连接并通信)。
“用接口类型变量调用方法”的本质是:类通过接口向外界提供服务,而调用方通过接口的抽象层使用这些服务。接口是被动的约束者,类才是主动的提供者(调用者是外界)。 这种设计让代码更灵活,但抽象层带来的“间接性”会让人产生方向混淆——这是学习抽象思维的必经之路,而非认知障碍。
让我们在学习编程的道路上继续成长吧!本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ

相关文章:
假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...
数据结构——Makefile、算法、排序(2025.2.13)
目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 ÿ…...
算法之 跳跃游戏
文章目录 55.跳跃游戏思路参考:56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析: 两种思路,思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr,如果i>mr就说明无法到达i,否则就是可以到达;…...
C#中的图形渲染模式
在C#中,图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式:AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释: 1. AUTO (自动模式) 含义:自动选择最适合…...
二.数据治理流程架构
1、数据治理流程架构核心思想: 该图描绘了一个以数据标准规范体系为核心,大数据生命周期管理为主线,数据资源中心为依托,并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...
瑞萨RA-T系列芯片ADCGPT功能模块的配合使用
在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…...
扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析
一、技术原理与数学推导(附核心公式) 1.1 扩散过程数学建模 马尔可夫链前向过程定义: q(x_{1:T}|x_0) \prod_{t1}^T q(x_t|x_{t-1})噪声调度函数(以余弦调度为例): \beta_t \frac{1 - \cos(\pi t/T)}…...
通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!
欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中,你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码,但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释: 一、数字含义&…...
大模型常识:什么是大模型/大语言模型/LLM
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...
iOS 中使用 FFmpeg 进行音视频处理
在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...
SAP-ABAP:SAP的Screen Layout Designer屏幕布局设计器详解及示例
在SAP中,Screen Layout Designer(屏幕布局设计器)是用于设计和维护屏幕(Dynpro)布局的工具。通过Screen Layout Designer,您可以创建和修改屏幕元素(如输入字段、按钮、文本、表格控件等&#x…...
一.数据治理理论架构
1、数据治理核心思想: 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法,解决数据治理机制缺失引发的业务和技术问题,并最终提升企业的数据管理水平。 数据治…...
亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用
文章目录 一、引言二、准备工作(Ollama 工具介绍与下载)2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...
MySQL安装MySQL服务时提示Install-Remove of the Service Denied
文章目录 问题描述排查1.字面意思2.搜索引擎3.官方文档4.源码 处理方法相关扩展 问题描述 MySQL安装MySQL服务时提示Install-Remove of the Service Denied! 详细报错如下: C:\Users\荷塘月色>net start mysql 服务名无效。请键入 NET HELPMSG 2185 以获得更多…...
(Windows | Linux)ssh访问服务器报错:no matching key exchange method found
问题现象 ssh user1192.168.1X.XX Unable to negotiate with 192.168.1X.XX port 22: no matching key exchange method found. Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkayal2g,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-…...
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
安装前检查服务器glibc版本,下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好,下载地址:https://pan.quark.cn/s/3137acc814c0,下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好,下载地址…...
有哪些滤波,原理是什么,分别在什么时候用
均值滤波(Average Filtering) 原理:通过计算像素点邻域内像素值的平均值来作为该像素点滤波后的新值。例如,对于一个 3x3 的邻域,将 9 个像素值相加然后除以 9 得到滤波后的像素值。优点:简单易实现&#x…...
深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符20250213
🛠️ 深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符 引言 🌟 在与 Oracle 数据库打交道的日常工作中,你是否遇到过 ORA-29275: partial multibyte character 这个令人头疼的错误?这个错误通常与字符编码、数…...
iOS 上自定义编译 FFmpeg
在 iOS 上自定义编译 FFmpeg 是一个复杂但非常灵活的过程。通过自定义编译,您可以选择启用或禁用特定的功能和编解码器,以满足项目的需求,同时减少二进制文件的大小。 1. 自定义编译 FFmpeg 1.1 准备工作 在开始编译之前,您需要以下工具和环境: macOS:运行编译的主机。…...
linux-带宽性能压测-全解iperfwgetspeedtest-cli
【摘要】本文介绍了iperf,wget,speedtest-cli 测速linux 服务器带宽,测速方法,和测速分析结果都有详解。同时也附带了windows的带宽测速已经这些软件的下载。快来测试下您的网速 1.iperf: iperf是一个开源网络带宽测试工具&…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
