2014年末,第一次去阿里面试印象很是深入,那是第一次对技术能力的打击,开始意识到本身的问题很严重,作技术的却没有专研技术,致使技术能力远不及本身的工做年限,其中最重要的一个问题就是多态,讲讲对多态的理解,我当时甚至分不清楚多态和重载重写的关系。聊着聊着甚至都不知道什么是多态了。java
放在今天,再来聊多态,可能又能扯出更多内容了。面试
《架构之道》上说多态无非是一种指针指向技术的应用,在c语言中就已经能够实现,面向过程当中就已经能实现的技术,如今面向对象把这个技术规范化了,以致于到上层语言层面抽象出了语言层面的名称,名曰多态。架构
那么,java里究竟又是如何来实现多态的。在jvm里多态是怎样实现的?这篇文章想写明白这个事情。jvm
原本想查看查看jvm的openjdk的源码来细说一番,折腾半天这源码仍是挺难看的,一时半会儿怕是看不出太多门道。性能
从一篇文章里看了看大体的流程。学习
https://bbs.pediy.com/thread-225413.htm 就是这篇。优化
基本上讲述了过程,在加载类的时候,会分析加载类的全部方法,判断是不是父类的方法的重写,若是是将vftable的地址更新到新的重写方法的地址,这样调用的时候取的就是新的覆盖过的方法了。指针
咱们来回忆一下,深刻jvm虚拟机里讲的,其实就是动态分派,分派的动做比较频繁,因此会优化出来一个虚方法表,使用虚方法表替换元数据查找来提升性能。htm
虚方法表中存放着各个方法的实际入口地址,若是某个方法在子类中没有被重写,那子类的虚方法表里面的地址入口和父类相同方法的地址入口是一致的,都指向父类的实现入口。若是子类重写了父类的方法,子类方法表中的地址将会替换为指向子类实现版本的入口地址。对象
这些就是多态的重写特性的实现原理了。
留一下高手的文章,未来可能深刻学习。