Java多态允许基类的引用指向派生类的对象,而在具体访问时实现方法的动态绑定。

知识准备

Java Class文件浅析
JVM 运行时数据区
Java 类的加载过程
Java 解析、绑定与分派

JVM运行时数据区

JVM运行时结构

Java文件编译了以后,将会生成class文件,存放至硬盘中,直到程序运行需要才会由类加载器加载至jvm的内存中,类加载器负责将class文件中的静态数据结构加载到jvm内存中的方法区,其中包括方法表、字段表和常量池等信息(关于class文件的结构请参见Java class文件浅析

此后,虚拟机将在内存中实例化一个java.lang.Class类的对象(并没有明确规定死在Java堆中,对于Hotspot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区里面),这个对象将作为程序访问方法区中的这些类型数据的外部接口。最典型的应用,在java反射应用中,使用class对象访问到该类支持的所有方法,定义的成员变量等(注意是class对象,在java中一切皆为对象,class也不例外!


Java方法调用

方法调用不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。
Java的方法调用有两种:

  • 静态绑定:
  • 动态绑定:

参考资料

《深入理解Java虚拟机》,§ 2.2 运行时数据区域
《深入理解Java虚拟机》,§ 2.3 HotSpot虚拟机对象探秘
《深入理解Java虚拟机》,§ 6.3 Class类文件的结构
《深入理解Java虚拟机》,§ 7 虚拟机类加载机制
《深入理解Java虚拟机》,§ 8 虚拟机字节码执行引擎
多态在 Java 和 C++ 编程语言中的实现比较