多态概述

同一个对象,在不同时刻表现出来的不同形态
image.png

多态的前提和体现

  • 有继承/实现关系
  • 有方法重写
  • 有父类引用指向子类对象(动物 animal 就是父类引用,new 猫()就是子类对象,最终研究的是对象的多态,所以重点要看子类对象)

image.png

  1. 继承和方法重写

image.png
3. 父类引用指向子类对象
image.png

多态中成员访问特点

  1. Animal有age ,但没有weight

image.png


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


image.png

运行:


image.pngimage.png
输出的age是40

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

  1. 无playGame

image.png


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


image.png

结果输出重写后的结果,所以以多态的形式访问成员方法,编译看左边,但是运行看右边

总结:
image.png

多态的好处和弊端

  1. dog

image.png

  1. cat

image.png

  1. Animal

image.png

  1. 测试类

image.png

  1. 动物操作

image.png
如果有很多动物,那按照注释的方法写很麻烦,所以这个时候可以用它们都继承的父类(Animal)的方法。
即理解可按照注释那样(多态的形式),编译看左边,运行看右边
如果要新加动物,只要在测试类中创建对象,调用方法就好了(动物操作类就不需要再改了)

  • 多态好处:提高了程序的扩展性,具体体现:定义方法时,父类作为参数,之后在使用时用的是具体的子类型参与操作

  • 弊端:不能访问具体的子类所特有的功能

image.pngimage.png

总结:
image.png

多态中的转型

  • 向上转型

    • 从子到父
    • 父类引用指向子类对象
  • 向下转型

    • 从父到子
    • 父类引用转为子类对象
  1. 动物类

image.png

  1. 猫类

image.png

  1. 测试类

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

多态转型内存图

image.png

案例

猫和狗

image.png

  1. 动物类

image.png

  1. 猫类

image.png

  1. 狗类

image.png

  1. 测试类

image.png