多态:是同一个行为具有不同表现形式的能力,主要用来实现动态联编(动态性)
💡 形象举例:
比如:现实生活中,有小宝、大宝,大宝是小宝的爸爸。
有一天,小宝接到打给大宝的电话,让大宝去喝喜酒,但是大宝不在家,小宝急中生智,打扮成大宝的样子去参加宴席。到宴席后,别人都以为大宝来了,其实是小宝打扮成爸爸的样子来替代大宝的。
这个故事告诉我们子类可以打扮成父类的样子去做父类能做得事情,这样的灵活性是非常强的,这顿饭对于别人来说是吃到大宝的肚子里,但是其实是吃到小宝的肚子里。
多态实现的必要条件:
1. 必须要有继承,即子类继承父类
2. 子类里必须要重写父类的方法(有重写才有变化,才叫做多态,实现不同效果)
3. 父类引用指向子类对象 (子类的对象赋值给父类的变量)
👇解释说明:
⭕ 大小类型转换是多态
前提:创建了Animal类, Cat类、Dog类继承Animal类(并且两个子类内有父类方法的重写)
Animal animal = new Cat();(这种方法不出错,与类型转换中的自动类型转换相似,Animal是大类(更抽象),Dog类是小类(更具体),把小类(具体)赋值给大类(抽象)——> 可以自动类型转换:子类自动转换为父类)
🔹 这表面上看起来确实是Animal类变量,但实际上调用的是Dog类的对象(就类似于虽然是小宝吃了饭,但大家都以为是大宝吃的饭)
🔹 子类可以使用父类的方法,但父类调用不了子类的方法
🔹 此时尽管实际上是Dog子类的对象,但是只能遵循父类的要求,不能调用Dog子类中的方法,可以调用子类中重写父类的方法(虽然是小宝,但只能做大宝做的事)👇
父类不能自动转化成子类(需要强制转换)
父类强制转换为子类成功的前提:父类指向子类
⭕ 作为方法的参数也可以是多态