news 2026/7/11 10:37:43

接口、继承、多态、封装理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接口、继承、多态、封装理解

封装的好处:
1、为了更加方便调用,一些固定参数不用多次写入。
2、同时如果底层代码修改,例如:传入参数如果有变动,你有100处位置调用了此方法,如果不用封装,需要修改100次。用了封装,只需要修改封装的函数即可。

继承的好处:
1、继承是为了一些共性的方法不用多次定义,例如定义一个人的参数。需要分出老人、儿童、男人、女人。定义身高、体重、年龄、外貌等。 身高、体重、年龄为共性 可以在父类定义,子类只需要定义外貌即可。不需要重复定义身高、体重、年龄。

接口的好处
1、具体代码实现看下面,方便理解,例如存在一个支付接口,存在多种类型支付。不可能在业务层把所有支付渠道都定义好(屎山代码)。接口存在的意义,就是可以让业务层接收接口类型的参数即可。不需要知道是什么类传输进来。
2、接口不是为了:少写代码、避免重复,定义一类行为的统一标准。类似于支付的规则 必须给那些参数才可以使用。
3、接口让【算法】和【数据】彻底分离(这是关键)
业务层只关心“什么时候支付、支付多少钱”,不关心“怎么支付”
4、接口是大型系统“协作边界”
在真实工程里:接口不是给 JVM 用的 是给人用的,定义规范,然后给人直接使用。这是团队协作、插件化、微服务的基础
5、通过下面的例子 也就能理解了,在调试代码的时候,命名看到的类型是PayService ,但是在实际调用的时候找不到对应的实现,或者跳转到别的类里面去了。就是因为PayService 是接口类型,在运行时会跳转到对象的指向的类里面具体实现的方法。

**多态:**接口 继承的衍生

把三者放在一个维度里对比(非常重要)
特性 解决的问题
封装隐藏细节,减少修改范围
继承表达“是什么”,复用共性
接口表达“能做什么”,隔离变化

一、封装(Encapsulation)——最重要,但最容易被忽略

1️⃣ 是什么?

把“怎么做”藏起来,只告诉你“能做什么”

2️⃣ 例子(贴近你刚才的问题)
❌ 不封装(坏)

Constructor<?>c=ReflectionFactory.getReflectionFactory().newConstructorForSerialization(cls,Object.class.getDeclaredConstructor());c.setAccessible(true);Objectobj=c.newInstance();

你用一次,要记一堆细节。

✅ 封装后(好)

Objectobj=SerializeUtils.createWithoutConstructor(cls);

3️⃣ 为什么要用?
问题 封装解决什么
实现会变 调用方不用改
代码难读 方法名就是说明
易误用 不给你机会乱传参数
可维护性 改一处,全生效

📌 你刚才问的那个问题,本质就是封装的意义

二、继承(Inheritance)——复用 + 表达“是什么”

1️⃣ 是什么?

子类是父类的一种(is-a)

2️⃣ 例子

classAnimal{voidspeak(){System.out.println("some sound");}}classDogextendsAnimal{voidbark(){System.out.println("wang");}}

3️⃣ 为什么要用?
不用继承会怎样?

classDog{voidspeak(){...}voideat(){...}voidsleep(){...}}classCat{voidspeak(){...}voideat(){...}voidsleep(){...}}

👉 重复代码
👉 修改一个行为要改一堆类

用继承后

classAnimal{voideat(){}voidsleep(){}}

4️⃣ 什么时候不该用继承?

⚠️ 如果只是“像”,不是“就是”
→ 不该继承

比如:

class Car extends Engine ❌

三、多态(Polymorphism)——同一接口,不同行为

之前一直在问:

OrderService 怎么知道 payService 是 Alipay?

答案现在你应该能对上了:

OrderService 不知道,
JVM 在运行时根据“对象真实类型”决定调用哪个方法

这就是 多态

没有多态

if(type==ALIPAY){alipay.pay();}elseif(type==WECHAT){wechat.pay();}elseif(type==UNIONPAY){...}

多态成立必须满足的 3 个条件
条件 1️⃣:有继承 / 实现关系 继承类或者实现接口
条件 2️⃣:父类引用指向子类对象 (用一个 Animal 类型的引用去指向一个 Dog 类型的对象)
Animal a代表父类的引用 继承了动物接口 new Dog();子类的对象

Animala=newDog();

继承的基础上多态举例
父类

classPerson{publicvoidintroduce(){System.out.println("我是一个人");}}

子类

classStudentextendsPerson{@Overridepublicvoidintroduce(){System.out.println("我是一个学生");}}
publicclassTest{publicstaticvoidmain(String[]args){Personp1=newPerson();Personp2=newStudent();// 多态发生p1.introduce();// 我是一个人p2.introduce();// 我是一个学生}}

条件 3️⃣:方法被重写(override)

四、接口(Interface)——约定,而不是实现

1️⃣ 是什么?

定义“必须有什么方法”,不关心怎么实现

2️⃣ 例子
没有接口的写法(强耦合)

classAlipayService{publicvoidpay(doubleamount){System.out.println("支付宝支付:"+amount);}}classWechatPayService{publicvoidpay(doubleamount){System.out.println("微信支付:"+amount);}}

业务层

classOrderService{publicvoidcreateOrder(StringpayType,doubleamount){if("alipay".equals(payType)){newAlipayService().pay(amount);}elseif("wechat".equals(payType)){newWechatPayService().pay(amount);}}}

❌ 问题

OrderService 需要知道所有支付实现

每加一种支付方式 → 改 if-else

无法单元测试(没法 mock)

代码一多就“屎山”

引入接口

/** * 支付能力接口 * 只定义“能做什么”,不关心“怎么做” */定义接口(能力契约)publicinterfacePayService{/** * 发起支付 * @param amount 支付金额 */voidpay(doubleamount);}

实现接口

publicclassAlipayServiceimplementsPayService{@Overridepublicvoidpay(doubleamount){System.out.println("使用【支付宝】支付:"+amount);}}
publicclassWechatPayServiceimplementsPayService{@Overridepublicvoidpay(doubleamount){System.out.println("使用【微信】支付:"+amount);}}

业务层定义

classOrderService{privatefinalPayServicepayService;// 通过构造方法注入publicOrderService(PayServicepayService){this.payService=payService;}publicvoidcreateOrder(doubleamount){payService.pay(amount);}}

主函数调用

publicclassMain{publicstaticvoidmain(String[]args){PayServicepayService=newAlipayService();OrderServiceorderService=newOrderService(payService);orderService.createOrder(100.0);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 19:19:30

视频硬字幕AI去除终极方案:本地化无损修复技术详解

视频硬字幕AI去除终极方案&#xff1a;本地化无损修复技术详解 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based tool for r…

作者头像 李华
网站建设 2026/7/8 22:39:22

BetterNCM插件完整教程:从零开始打造你的专属音乐工作站

BetterNCM插件完整教程&#xff1a;从零开始打造你的专属音乐工作站 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一、界面单调而困扰吗&#xff1f;想要把普…

作者头像 李华
网站建设 2026/7/10 7:40:45

大模型注意力机制全解析:从MHA到MoBA,一文掌握七种核心算法

文章详细解析了大模型中七种注意力机制&#xff08;MHA、MQA、GQA、MLA、NSA、SSA、MoBA&#xff09;的原理、优缺点及应用场景。从密集计算到稀疏化&#xff0c;从静态模式到动态路由&#xff0c;展示了注意力机制在效率与表达能力间的演进历程。文章对比了各机制在工程实现与…

作者头像 李华
网站建设 2026/7/10 0:17:07

LobeChat能否实现AI调酒师?饮品配方创意与口味偏好匹配

LobeChat能否实现AI调酒师&#xff1f;饮品配方创意与口味偏好匹配 在一家未来感十足的酒吧里&#xff0c;顾客刚坐下&#xff0c;轻声对吧台说&#xff1a;“来杯清爽点的&#xff0c;带点柑橘味&#xff0c;不要太烈。” 没有翻菜单&#xff0c;也没有和调酒师寒暄——回应他…

作者头像 李华
网站建设 2026/7/7 13:20:39

如何快速绕过iOS激活锁:AppleRa1n完整解决方案指南

如何快速绕过iOS激活锁&#xff1a;AppleRa1n完整解决方案指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当你面对iOS设备激活锁问题&#xff0c;无论是忘记Apple ID密码还是二手设备无法激活&am…

作者头像 李华
网站建设 2026/7/11 12:55:47

3分钟深入解析LLM注意力机制:轻松掌握核心原理!

简介 本文以通俗易懂的方式解释了大模型核心的Attention&#xff08;注意力&#xff09;机制。通过加权求和&#xff0c;模型有重点地关注关键信息而非平等处理所有内容。文章用淘宝购物类比解释了Q&#xff08;查询&#xff09;、K&#xff08;键&#xff09;、V&#xff08;…

作者头像 李华