多态:从字面上理解,就是多种形态,多种状态的含义,在这里,指的是一个对象具有多种形态的特点。说的再简单点,就是一个对象可以从一种类型转换为另外一种类型。有向上转型和向下转型两种形式。
面试时可以多加一种:方法的多态(重载和重写)
向上造型(向上转型)
父类型的变量引用子类型的对象。
向上转型肯定会成功,是一个隐式转换。
向上转型后的对象,将只能够访问父类中的成员(编译期间,看变量类型)
如果调用的是重写过的方法,那么调用的一定是重写方法(运行期间,看对象)
应用场景:在定义方法时,形式参数是父类型的变量。这样更加灵活,可以传任意子类型的对象
向下转型
父类型变量赋值给子类型的变量,需要强制转换,是一个显式转换。
可能会失败,失败的话,会报类造型异常ClassCastException
为了避免ClassCastException ,可以使用instanceof 来判断:变量指向的对象是否属于某一个类型。
应用场景:
多数情况下,定义方法时,形参都是父类型的变量,原因是可以接受任意子类型的对象
但是有的时候,在这样的方法里的逻辑中,可能会用到该对象的独有功能,因此会涉及到向下转型
if(am instanceof Cat){ //因为am指向的是一个Dog对象,不属于Cat类型,因此进不去分支。
// 所以避免了报错
Cat c = (Cat)am;
c.getMouse();