多态概述
同一个对象,在不同时刻表现出来的不同形态
多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象(动物 animal 就是父类引用,new 猫()就是子类对象,最终研究的是对象的多态,所以重点要看子类对象)

- 继承和方法重写

3. 父类引用指向子类对象
多态中成员访问特点
- Animal有age ,但没有weight


虽然最终内存中的对象是猫,但外界看到的,是动物这个引用。所以我们通过多态的形式访问成员变量的时候,编译要看左边。

运行:


输出的age是40
所以,以多态的形式去访问成员变量,访问的是父类中的
也就是说,多态的形式访问成员变量,编译要看左边,运行也要看左边。
- 无playGame



以多态的形式访问成员方法,它的编译也要看左边,如果左边没有,就会报错

结果输出重写后的结果,所以以多态的形式访问成员方法,编译看左边,但是运行看右边
总结:
多态的好处和弊端
- dog

- cat

- Animal

- 测试类

- 动物操作

如果有很多动物,那按照注释的方法写很麻烦,所以这个时候可以用它们都继承的父类(Animal)的方法。
即理解可按照注释那样(多态的形式),编译看左边,运行看右边
如果要新加动物,只要在测试类中创建对象,调用方法就好了(动物操作类就不需要再改了)
多态好处:提高了程序的扩展性,具体体现:定义方法时,父类作为参数,之后在使用时用的是具体的子类型参与操作
弊端:不能访问具体的子类所特有的功能


总结:
多态中的转型
向上转型
- 从子到父
- 父类引用指向子类对象
向下转型
- 从父到子
- 父类引用转为子类对象
- 动物类

- 猫类

- 测试类

通过向下转型解决了多态的弊端——不能访问子类中的特有功能
多态转型内存图

案例
猫和狗

- 动物类

- 猫类

- 狗类

- 测试类

