知识分享之概念——程序中多态的理解,什么是继承什么是多态?

本文深入解析了编程中的多态概念,通过生活中的继承比喻,阐述了类与子类的关系。重点讲解了如何通过继承实现代码复用,并通过实例说明多态是如何通过子类实现接口统一但行为各异。

知识分享之概念——程序中多态的理解,什么是继承什么是多态?

背景

日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。
同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。

开发环境

  • 系统:windows10
  • 数据库:MariaDB

内容

在百度百科上面是这样说的

在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。

说到多态,我们就不得不谈一下继承的概念,我们日常生活中经常听到的“财产继承”就很好的阐述了继承的概念,本质上就是父辈的资产继承给子孙后代。那在程序上就很好理解了,我们创建一个父级类,其他类继承一下父级类,那自然也就有了父级类的一些特性。
那什么是多态呢,那我们就依旧延续继承的资产问题再进行分析,假设子孙后代都继承了一万元,分别是A、B、C三个,这时大家都面临着这笔钱怎么处理的问题,这个问题就产生了一个统一的接口“花钱”,子孙A在花钱上用做了日常的花天酒地,子孙B将这笔钱存进了银行,子孙C将这笔钱捐献给了贫困山区。这就出现了同样一个花钱的动作,子孙后代的不同处理方式。而这种处理方式就是每个子孙后代(子级类)对于“花钱”这个接口的不同实现。
那么在程序使用时又是如何体现呢。
首先父级具备一个统一接口“花钱”,子级类A、子级类B、子级类C分别继承了该父级,并实现了“花钱”这个接口。

当程序运行时,这时我们需要开始调用花钱这个接口,并传入了【子级类A对象】,这时就触发了子级类A中的花钱实现。
同理,传入【子级类B对象】,这时就触发了子级类B中的花钱实现。

而这就是我们本节讲的多态,总结:多态即是统一类别接口下的多种运行状态,是同一类别下不同子级的独立实现。

本文声明:

88x31.png

知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

### Java 中静态多态与动态多态概念及区别 #### 静态多态 静态多态,也被称为编译时多态,主要体现在方法重载上。当多个同名的方法具有不同参数列表(包括参数的数量、类型或顺序不一致),这些方法可以在同一个类中共存[^1]。编译器依据调用处所提供的实参来决定具体应调用哪一个版本的方法。这意味着所有的决策都在编译期间完成,因此效率较高。 ```java class Calculator { int add(int a, int b) { /* ... */ } // 方法1 double add(double a, double b) { /* ... */ } // 方法2 } ``` 上述例子展示了如何在同一类`Calculator`内部定义两个名为`add`但接受不同类型参数的方法。这便是静态多态的一个典型实例[^4]。 #### 动态多态 相比之下,动态多态是指运行时期间发生的多态现象,通常涉及继承关系下的方法覆盖(override)[^3]。子类可以提供父类已有功能的新实现方式;当通过父类型的引用指向子类型对象并调用该被覆写的方法时,JVM会在运行时刻自动选择合适的实现版本执行——这就是所谓的“后期绑定”或者说是基于对象的实际类型而非声明类型来进行操作解析的过程[^5]。 ```java class Animal { void sound() { System.out.println("Some generic animal sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Bark!"); } } public class Test { public static void main(String[] args){ Animal myPet = new Dog(); // 实际创建的是Dog的对象 myPet.sound(); // 输出"Bark!"而不是默认的Animal的声音 } } ``` 在这个案例里,尽管变量`myPet`被声明为`Animal`类型,但由于其真正持有的是一个`Dog`实例,所以调用`sounds()`方法时实际上触发了后者特有的行为表现。 综上所述,两者的主要差别在于: - **时机**:前者由编译器处理,在编写代码阶段就已确定下来;后者依赖于虚拟机的行为判断,在应用程序启动后才会显现出来。 - **灵活性**:由于动态多态允许在不知道确切的数据类型的情况下工作,故此提供了更高的抽象层次以及更好的扩展能力。 - **性能影响**:虽然每次遇到可能存在的虚函数表查找都会带来额外开销,但对于大多数应用场景而言这种损耗是可以忽略不计的小量级事件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN華少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值