面向对象特征之————多态

多态分为:编译时多态 和 运行时多态。面向对象特征之————多态


编译时多态:编译期 就能确定我要调用 多个重载的方法中的哪一个,具体是调用子类的还是父类的那个方法是不确定的。
实现:重载

运行是多态:程序运行时才能确定要调用哪个方法(是调用子类的那个方法 还是 调用父类的那个方法)。这在编译时是不能确定的。
怎么样才能展现出多态的效果:重写。
实现机制:动态绑定。
Java 对于方法调用动态绑定的实现主要依赖于方法表。
方法表:位于方法区的某个类的类信息中。方法表中的方法包括从父类继承的所有方法以及自身重写(override)的方法。


面向对象特征之————多态
Person p = new Girl();
p.speak();

原理:
1、JVM首先查看父类Person的方法表,得到speak方法在该方法表的偏移量(即:一个Index索引位置),这样就得到该方法的直接引用。
2、 根据this指针(this指针的信息位于:编译后的class文件中) 确定对象的实际类型,然后使用实际类型的方法表。在实际类型的方法表中找对应的方法条目,根据方法条目指向哪个类的方法代码,去调用。如果该类重写了父类的方法,则直接调用实际类型的方法;否则如果该类没有重写。则按照继承关系从下往上搜索直至找到那个方法。


JVM 的方法调用指令有四个 分别是 invokestatic,invokespecial,invokesvirtual 和 invokeinterface。前两个是静态绑定,后两个是动态绑定的。本文也可以说是对于JVM后两种调用实现的考察。