从JVM角度看Java多态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从JVM角度看Java多态相关的知识,希望对你有一定的参考价值。

Java多态的三个必要条件:

1、 继承

2、 子类重写父类方法

3、 父类引用指向子类对象

然后看一个例子

从JVM角度看Java多态

从JVM角度看Java多态

输出结果为:

从JVM角度看Java多态

给出结论:Father  c  =  new  Child()    在c的眼里只能看到 child 里面的 father 属性!

                   当满Java多态的三个条件时,可以发现c.eat()调用的实际上是子类的eat(是因为子类重写覆盖了父类方法),

                   但c.age调用的还是父类的age(属性/变量不存在重写和覆盖),而c.play()则不会通过编译。

 

 

 

但是在java的引用中Father不但指定了c以何种方式访问内存,也规定了能够访问内存空间的大小。

我们看Father实例对象的大小是占两行,但Child实例对象占三行(这里就是简单量化一下)。

所以虽然c指向的是Child实例对象,但是前面有Father修饰它,它也只能访问两行的数据,也就是说c根本访问不到Child类中的age!!!只能访问到Father类的age,所以输出40

 

从JVM角度看Java多态

我们看到Parent的方法表占三行,Child的方法表占4行,c虽然指向了Child类的实例对象,

而对象中也有指针指向Child类的方法表,但是由于c受到了Father的修饰,通过c也只能访问到Child方法表中前3行的内容!!!!

然而前面说过,在方法表的形成过程中,子类重写的方法会覆盖掉表中原来的数据,也就是Child类的方法表的第三行是指向Child.eat的引用,

而不是指向Parent.eat(因为方法表产生了覆盖),所以c访问到的是Child.eat。也就是子类的方法!!!这种情况下,c是没有办法直接访问到父类的eat方法的。

 

以上是关于从JVM角度看Java多态的主要内容,如果未能解决你的问题,请参考以下文章

从JVM的角度看JAVA代码--代码优化

从虚拟机指令执行的角度分析JAVA中多态的实现原理

从jvm角度来解析java语法糖

JAVA基础

从jvm角度看懂类初始化方法重载重写

如何从jvm角度看懂类初始化方法重载重写