多态概述
同一个对象,在不同时刻表现出来的不同形态
多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象(动物 animal 就是父类引用,new 猫()就是子类对象,最终研究的是对象的多态,所以重点要看子类对象)
- 继承和方法重写
3. 父类引用指向子类对象
多态中成员访问特点
- Animal有age ,但没有weight
虽然最终内存中的对象是猫,但外界看到的,是动物这个引用。所以我们通过多态的形式访问成员变量的时候,编译要看左边。
运行:
输出的age是40
所以,以多态的形式去访问成员变量,访问的是父类中的
也就是说,多态的形式访问成员变量,编译要看左边,运行也要看左边。
- 无playGame
以多态的形式访问成员方法,它的编译也要看左边,如果左边没有,就会报错
结果输出重写后的结果,所以以多态的形式访问成员方法,编译看左边,但是运行看右边
总结:
多态的好处和弊端
- dog
- cat
- Animal
- 测试类
- 动物操作
如果有很多动物,那按照注释的方法写很麻烦,所以这个时候可以用它们都继承的父类(Animal)的方法。
即理解可按照注释那样(多态的形式),编译看左边,运行看右边
如果要新加动物,只要在测试类中创建对象,调用方法就好了(动物操作类就不需要再改了)
多态好处:提高了程序的扩展性,具体体现:定义方法时,父类作为参数,之后在使用时用的是具体的子类型参与操作
弊端:不能访问具体的子类所特有的功能
总结:
多态中的转型
向上转型
- 从子到父
- 父类引用指向子类对象
向下转型
- 从父到子
- 父类引用转为子类对象
- 动物类
- 猫类
- 测试类
通过向下转型解决了多态的弊端——不能访问子类中的特有功能
多态转型内存图
案例
猫和狗
- 动物类
- 猫类
- 狗类
- 测试类