Java多态性的三个必备条件:
1、继承
2、子类重写父类的方法
3、父类引用指向子类对象
让我们看一个例子
输出结果如下。
得出结论: 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
Parent的方法表有三行,Child的方法表有四行,c指向Child类的实例对象。
虽然对象也有一个指向Child类的指针的方法表,但由于c被限定为Father,因此通过c也只能访问Child方法表的前三行内容!
但是,如上所述,在创建方法表的过程中,子类重写方法将重写表中的原始数据。 也就是说,Child类方法表的第三行是对Child.eat的引用。
不是指向Parent.eat (因为方法表上产生了覆盖),而是c访问的是Child.eat。 也就是子类的方法! 在这种情况下,c不能直接访问父类的eat方法。