一、多态概念多态同一个行为不同对象有不同的实现形态。 父类引用指向子类对象调用重写方法时会执行子类重写后的逻辑。多态的前提条件必须全部满足存在继承 / 实现关系extends /implements子类对父类方法进行方法重写 Override父类引用指向子类对象父类 引用变量 new 子类();通俗理解同样是动物叫狗是汪汪汪猫是喵喵喵同一个 “叫” 行为不同对象表现不一样就是多态。二、多态基础语法格式//父类引用指向子类对象 父类类型 变量名 new 子类类型(); 变量名.方法();代码演示//父类 class Animal{ public void shout(){ System.out.println(动物发出叫声); } } //子类Dog继承Animal class Dog extends Animal{ //重写父类shout方法 Override public void shout() { System.out.println(小狗汪汪汪); } } //子类Cat继承Animal class Cat extends Animal{ Override public void shout() { System.out.println(小猫喵喵喵); } } public class TestPoly { public static void main(String[] args) { // 多态写法父类引用接收子类实例 Animal a1 new Dog(); Animal a2 new Cat(); //调用重写方法执行子类的逻辑 a1.shout(); a2.shout(); } }运行输出小狗汪汪汪 小猫喵喵喵重点编译看左边父类运行看右边子类 编译检查父类有没有该方法运行执行子类重写后的方法。三、多态成员访问规则重点初学者易错1. 成员方法编译看左边运行看右边编译看父类是否存在该方法运行执行new出来的子类重写后的方法。2. 成员变量编译看左边运行也看左边多态下变量不看子类永远取父类中的变量值。class Father{ int num 10; public void show(){ System.out.println(父类show); } } class Son extends Father{ int num 20; Override public void show(){ System.out.println(子类show); } } public class Demo{ public static void main(String[] args) { Father f new Son(); System.out.println(f.num); //输出10取父类变量不是子类 f.show(); //输出子类show方法执行子类重写 } }输出10 子类show⚠️坑点多态引用访问成员变量不会调用子类的成员变量只看引用的父类类型。开发中尽量不要使用同名成员变量。四、多态的好处提高代码扩展性方法参数写父类类型可以接收所有它的子类对象。解耦合方法不需要依赖具体子类只依赖父类。代码示例多态作为方法参数class Animal{ public void shout(){} } class Dog extends Animal{ Override public void shout() { System.out.println(汪汪汪); } } class Cat extends Animal{ Override public void shout() { System.out.println(喵喵喵); } } public class Test { //参数写父类Animal可以接收Dog、Cat所有子类 public static void animalCry(Animal animal){ animal.shout(); } public static void main(String[] args) { animalCry(new Dog()); animalCry(new Cat()); } }以后新增Pig extends Animal不需要修改 animalCry 方法直接传入 new Pig () 即可这就是扩展性。五、多态的弊端父类引用指向子类对象时不能直接调用子类独有的方法。class Animal{} class Dog extends Animal{ //子类独有的方法父类没有 public void guardHome(){ System.out.println(狗看家); } } public class Demo{ public static void main(String[] args) { Animal a new Dog(); //a.guardHome(); //编译报错父类没有这个方法无法直接调用 } }解决方案向下转型强制类型转换六、向上转型 向下转型1. 向上转型就是多态本身自动转换Animal a new Dog();子类对象自动转为父类类型安全不需要强转。2. 向下转型强制转换目的调用子类独有方法语法子类 变量 (子类)父类引用;Animal a new Dog(); Dog dog (Dog) a; //向下强制转型 dog.guardHome(); //现在可以调用子类独有方法风险如果实际对象不是目标子类运行抛出ClassCastException类型转换异常。使用 instanceof 做判断避免转型异常对象 instanceof 类判断该对象是不是这个类 / 子类的实例返回 boolean。public static void test(Animal animal){ if(animal instanceof Dog){ Dog d (Dog) animal; d.guardHome(); }else if(animal instanceof Cat){ Cat c (Cat) animal; c.catchMouse(); } }七、本章小结多态三要素继承 / 实现、方法重写、父类引用指向子类对象。口诀成员方法编译看左运行看右成员变量编译运行都看左。向上转型自动完成向下转型需要强转配合instanceof防止异常。好处方法参数写父类兼容全部子类提升扩展缺点不能直接访问子类特有功能。