Java多态的实现机制原理
参考内容:
Java的多态(深入版):https://segmentfault.com/a/1190000021936858
Q:Java的多态的实现机制原理
A:知识准备:
1. JVM中的方法调用指令:

2.Java中的方法调用分成两种类型:
静态调用&动态调用

我们来看看下面的代码。在如下的代码中Human类型的引用man实际上是一个Man类型,woman也是类似的意思。然后在StaticDispatch中有三个重载方法,其中放入的参数类型是不同的。
最后输出的结果:

这是因为重载是静态分派的,Human这个类型被称为静态类型,实际类型是Man Woman。实际类型是在运行时确定的。

我们再来看看重写的例子:
这个很显然,输出的结果是我们重写之后的方法的输出。
我们通过字节码来看看原因:
1. 对于重载的例子:

可以看到在字节码中调用了invokevirtual调用了虚方法,因为重载在编译器是通过静态类型确定方法参数的,所以我们能够在Class翻译成的Java代码中还看到,字节码将man对象转换成了Human对象。
2. 重写的例子:
重写的例子和重载的例子类似,而且都使用了invokevirtual指令。invokevirual指令在运行期会去寻找接受者的实际类型。所以对应的Java class字节码没有像重载一样转型成human:
