向上转型
向上转型在写代码的过程中经常会用到,它不仅是实现多态的重要机制,也是Java继承体系的精华体现。
向上转型常见的形式是:Person person = new Student();这里的Student类是Person类的子类,我们通过Student类的实例构建了一个父类的对象。在方法的调用层面上,person对象只能调用在Person类中存在的方法,且其中的方法一旦被子类重写,那么就会优先调用子类中被重写的方法。或许在运用层面明白这些就足够了,但是在算法的设计以及JVM调优中,只是会运用是远远不够,还需要理解其底层的原理。接下来让我们在JVM层面去理解向上转型的方法调用过程。
方法表的概念
继承过程图示:
简述:假设存在这样一个继承关系,Object类被子类1继承,子类1又被子类2继承。图示展示了在继承过程中方法和方法表的变化。每当用到一个类,如果它还没有被加载,那么就会把类的信息翻译为字节码记载到JVM相应的区域(每个类只加载一次)。
1、Object类加载:如图,我们先new一个Object对象,JVM会先在堆中申请一块存储空间存放Object类的方法,然后在方法区生成一张方法表,方法表中有指针,指向这些方法,在需要调用这些方法的时候,就可以通过方法表来索引方法。
2、然后让子类1继承Object类,同样,会为子类1在堆中开辟一块存储空间来存放子类1的方法(是指代码中写在子类1中的那些方法),然后生成子类1的方法表,方法表首先会继承一份自父类(类似于复制),父类有的方法子类都会获得,且子类和父类的同名方法在方法表上的位置偏移量完全相同,这时,我们再根据子类下写的那些方法来调整方法表,如果子类重写了一个父类的同名方法,那么指针会修改为指向子类的方法存储区域