首页 > 其他分享 >同程面试:说一下多态的实现原理?

同程面试:说一下多态的实现原理?

时间:2023-11-16 09:46:27浏览次数:32  
标签:调用 对象 绑定 多态 同程 面试 类型 方法

前段时间朋友去同程旅行面试,被问到了一个看似简单,实则“有点东西”的问题:“了解多态的实现原理吗?”,所以今天我们就来聊一聊这个问题。

和朋友的聊天截图:
image.png

为了保护朋友隐私,所以这里只把咱们今天讨论的问题展示给大家,如果有需要整个面试题的,可以单独找我获取:gg_stone【备注:同程】
image.png

1.回答误区

多态是面向对象编程中的一个重要特性,它主要是通过方法重写和方法重载来实现的。

但如果你面试的时候,给面试官说多态的实现原理是“方法重写和重载”,那你多半就凉凉了。因为“方法重写和方法重载”是多态的实现方式,但并不是它的实现原理。

2.什么是多态?

多态是面向对象编程中的一个重要概念,它允许通过父类类型的引用变量来引用子类对象,并在运行时根据实际对象的类型来确定调用哪个方法。换句话说,一个对象可以根据不同的情况表现出多种形态。

通过多态,我们可以利用父类类型的引用变量来指向子类对象,并根据实际对象的类型调用对应的方法。这样可以在不修改现有代码的情况下,动态地切换和扩展对象的行为。

多态有以下几个特点和优势:

  1. 可替换性:子类对象可以随时替代父类对象,向上转型。
  2. 可扩展性:通过添加新的子类,可以扩展系统的功能。
  3. 接口统一性:可以通过父类类型的引用访问子类对象的方法,统一对象的接口。
  4. 代码的灵活性和可维护性:通过多态,可以将代码编写成通用的、松耦合的形式,提高代码的可维护性。

3.实现原理

要了解多态的实现原理,需要先了解两个概念:动态绑定和虚拟方法调用。

3.1 动态绑定

动态绑定(Dynamic Binding):指的是在编译时,Java 编译器只能知道变量的声明类型,而无法确定其实际的对象类型。而在运行时,Java 虚拟机(JVM)会通过动态绑定来解析实际对象的类型。这意味着,编译器会推迟方法的绑定(即方法的具体调用)到运行时。正是这种动态绑定机制,使得多态成为可能。

3.2 虚拟方法调用

虚拟方法调用(Virtual Method Invocation):在 Java 中,所有的非私有、非静态和非 final 方法都是被隐式地指定为虚拟方法。虚拟方法调用是在运行时根据实际对象的类型来确定要调用的方法的机制。当通过父类类型的引用变量调用被子类重写的方法时,虚拟机会根据实际对象的类型来确定要调用的方法版本,而不是根据引用变量的声明类型。

3.3 实现原理综述

所以,多态的实现原理主要是依靠“动态绑定”和“虚拟方法调用”,它的实现流程如下:

  1. 创建父类类型的引用变量,并将其赋值为子类对象。
  2. 在运行时,通过动态绑定确定引用变量所指向的实际对象的类型。
  3. 根据实际对象的类型,调用相应的方法版本。

以上就是多态的实现原理。

小结

面向对象的特征:封装、继承和多态,其中多态的面试问题最多,而多态的实现原理看似简单,实在需要了解 JVM 层面的一些知识(动态绑定和虚拟方法调用)才能回答好,所以这也侧面说明了一个问题,想要拿到好的 Offer 和薪资,一定要提前准备才行。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:调用,对象,绑定,多态,同程,面试,类型,方法
From: https://www.cnblogs.com/vipstone/p/17835483.html

相关文章

  • Mysql面试题
    1、MySQL有哪些数据库类型?数值类型有包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节的整数类型。1)任何整数类型都可以加上UNSIGNED属性,表示无符号整数。2)任何整数类型都可以指定长度,但它不会限制数据的合法长度,仅仅限制了显示......
  • 每天5道Java面试题(第12天)
    1. 为什么要ArrayList扩容要不是固定值?扩容固定容量,很难决定到底取多少值合适,取任何具体值都不太合适,因为所需数据量往往由数组的客户端在具体应用场景决定。所以依赖于当前已经使用的量*系数,才比较符合实际应用场景。2. Vector为什么是线程安全的集合?Vector的所有方法加上了s......
  • 如何准备2024年的系统设计面试?
    1前言如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一。如......
  • 一个关于 i++ 和 ++i 的面试题打趴了所有人
    我嘴欠问了下这个面试题:i++和++i有什么区别,谁的效率更高?并解释出原因。没错,我竟然答不上来,贼尴尬,心想早知不问了。主管有些意外,又问了几个别的同事,没一个答上来的。他脸黑了……前言都说大城市现在不好找工作,可小城市却也不好招人。我们公司招了挺久都没招到,主管......
  • js是一门基于对象的语言,js不是面向对象的语言,但是可以模拟面向对象的思想,具体说面向
    下列关于JavaScript的说法中正确的是()A所有变量在使用之前必须做声明BJavaScript是面向对象的程序设计语言CJavaScript是解释性语言DJavaScript前身是Oak语言正确答案:C选C。解释性语言是相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由......
  • Android并发编程高级面试题汇总(含详细解析 四)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • [左神面试指南] 递归和动态规划[下]篇
    CD42子数组异或和为0的最多划分⭐/*⭐DP⭐*/publicclassCD42_1{publicstaticintsolution(int[]arr){HashMap<Integer,Integer>map=newHashMap<>();int[]dp=newint[arr.length];inttemp=0;dp[0]=arr[0]......
  • 常见面试题-Spring的aop和ioc如何实现?
    Spring的aop和ioc怎么实现?Spring的IOC是如何实现的呢?Spring的IOC是通过工厂+反射去实现的,在IOC中,Spring会将创建的Bean都放在工厂中,我们可以通过@Configuration来定义配置类,在配置类中通过@Bean来将Bean创建在Bean工厂中,在对Bean进行实例化时,使用的......
  • Java多线程面试题
    目录0、请你说说线程和进程的区别1、请你说说多线程2、说说CAS的ABA问题3、说说你对AQS(抽象队列同步器)的理解4、Java哪些地方使用了CAS5、说说怎么保证线程安全5、说说你了解的线程同步方式6、说说synchronized的用法及原理7、synchronized和Lock有什么区别8、说说Java......
  • Android并发编程高级面试题汇总(含详细解析 三)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......