1. 多态引入

①什么是多态?
②多态的代码实现(对象多态与行为多态)?

多态含义:父类给个方法,各个子类重写它;用父类引用调用这个方法,实际跑的是子类自己写的代码。

对象多态: p1 声明的类型是父类 People,但实际创建的是子类 Student 对象;p2 声明的类型是父类 People,但实际创建的是子类 Teacher 对象。

行为多态:子类重写父类的同名方法,调用的时候,运行执行子类重写后的代码
具体代码如下面那例子(运行的都是子类中重写的方法,输出的变量都量父类中的属性)

注意:只有对象、行为多态,它们都是编译看左边(无Animal对象或Animal对象中无run方法就会报错),运行看右边!(创建的是Wolf对象、Tortoise对象,运行时也是运行这两对象中的重写方法)

2. 多态优缺点

①多态的2大优点?
②多态的1大缺点?

好处1:便于new出来的子类的维护。

这个就是玩游戏的时候,选择不同角色之后,虽然按相同的键,但是每个角色所使用的技能都不一样的原理吧(就比如上面那代码,你可以直接换那个student,不会报错,因为它编译时看左边,编译时不报错,不管它运行哪个子类的方法,就都能运行出来!!!)
解耦指降低代码中不同类之间的依赖程度,也正因为如此,java中可以让员工A开发People类,员工B开发子类1,员工C开发子类2……

好处2:方便后续作为形参时能直接“父类”,因为都是一个类别的,为每个子类搞个方法太麻烦了……

就是定义方法时,传入的形参写成“People p”,它就能同时接收“Student s”与“Teacher t”这两个类型的对象!(如果定义方法时传入的是Student s,它就只能接收Student对象,比如下图例子)

上图那个方法中的Wolf改成Animal就不会报错了!
但多态有一个明显的问题(子类重写的方法才能直接用a.方法!)

3. 多态中强转

①如何解决多态中变量无法调用子类独有方法的问题?
②instanceof关键字?

多态中的自动类型转换、强制类型转换(强转之后,就能调用子类的独有功能了)

下面注意事项中,在编译时不会报错(画红线),在运行时才会报错!(这tm就是经常要改的bug,代码中无红线,当运行报错,巨恶心!)

但有些时候,代码太多时你不知道应该强转成哪一个,可以使用下面的instanceof关键字,具体代码如下所示(对象变量 instanceof 类:用于判断对象的真实类型是不是这类,是就返回true,不是就返回false)