再聊多态

2014年底,第一次去阿里面试印象非常深刻,那是第一次对技术能力的打击,开始意识到自己的问题很严重,做技术的却没有专研技术,导致技术能力远不及自己的工作年限,其中最重要的一个问题就是多态,讲讲对多态的理解,我当时甚至分不清楚多态和重载重写的关系。聊着聊着甚至都不知道什么是多态了。

放在今天,再来聊多态,可能又能扯出更多内容了。

《架构之道》上说多态无非是一种指针指向技术的应用,在c语言中就已经可以实现,面向过程中就已经能实现的技术,现在面向对象把这个技术规范化了,以至于到上层语言层面抽象出了语言层面的名称,名曰多态。

那么,java里究竟又是如何来实现多态的。在jvm里多态是怎样实现的?这篇文章想写明白这个事情。

本来想查看查看jvm的openjdk的源码来细说一番,折腾半天这源码还是挺难看的,一时半会儿怕是看不出太多门道。

从一篇文章里看了看大致的流程。

https://bbs.pediy.com/thread-225413.htm 就是这篇。

基本上讲述了过程,在加载类的时候,会分析加载类的所有方法,判断是否是父类的方法的重写,如果是将vftable的地址更新到新的重写方法的地址,这样调用的时候取的就是新的覆盖过的方法了。

我们来回忆一下,深入jvm虚拟机里讲的,其实就是动态分派,分派的动作比较频繁,所以会优化出来一个虚方法表,使用虚方法表替换元数据查找来提高性能。

虚方法表中存放着各个方法的实际入口地址,如果某个方法在子类中没有被重写,那子类的虚方法表里面的地址入口和父类相同方法的地址入口是一致的,都指向父类的实现入口。如果子类重写了父类的方法,子类方法表中的地址将会替换为指向子类实现版本的入口地址。

这些就是多态的重写特性的实现原理了。

留一下高手的文章,将来可能深入学习。

原文地址:https://www.cnblogs.com/aquariusm/p/11212966.html