1、介绍
多态是同一个行为具有多个不同表现形式或形态的能力
多态就是同一个接口,使用不同的实例而执行不同操作
多态性是对象多种表现形式的体现。
2、多态存在的必要条件
比如:
1 Parent parent = new Child();
3、代码示例 ①、基于继承实现的多态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 public class Animal { public String name = "animal" ; public void eat (Animal animal) { System.out.println("animal say ......" ); } public void sleep () { System.out.println("animal sleep......" ); } public static void speak () { System.out.println("animal speak ......." ); } } public class Cat extends Animal { @Override public void eat (Animal animal) { System.out.println("****************************************" ); if (animal instanceof Animal) { System.out.println("animal is instanceof Animal....." ); } if (animal instanceof Cat) { System.out.println("animal is instanceof Cat....." ); } if (animal instanceof Dog) { System.out.println("animal is instanceof Dog....." ); } if (animal instanceof Object) { System.out.println("animal is instanceof Object....." ); } System.out.println(animal + " say ......." ); System.out.println("****************************************" ); } } public class Dog extends Animal { public String name = "dog" ; @Override public void sleep () { System.out.println("dog sleep......" ); } public static void speak () { System.out.println("dog speak ......." ); } } public class TestMain { public static void main (String[] args) { Animal animal1 = new Cat(); animal1.eat(new Cat()); animal1.eat(new Dog()); Animal animal2 = new Dog(); animal2.sleep(); animal2.speak(); System.out.println(animal2.name); } }
测试结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 **************************************** animal is instanceof Animal..... animal is instanceof Cat..... animal is instanceof Object..... com.gulj.springbootvalidator.duotai.Cat@378 bf509 say ....... **************************************** **************************************** animal is instanceof Animal..... animal is instanceof Dog..... animal is instanceof Object..... com.gulj.springbootvalidator.duotai.Dog@5f d0d5ae say ....... **************************************** dog sleep...... animal speak .......
总结说明
对象具有两种类型:
编译类型(编译类型必须是运行类型的父类或相同)
运行类型
在形式上,类定义的对象只能看到自己所属类中的成员。父类对象无法看到子类的新扩充方法。
父类被关键词static修饰的静态方法是不能被子类覆盖的,可以利用这一特性达到隐藏的效果
使用父类类型的引用指向子类的对象
当子类和父类存在相同的字段 时候,无论修饰符是什么,都会在各自的内存空间中存储数据,则字段不具有多态性
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
1 2 final Animal animal = new Cat();
②、基于接口实现的多态 (不在举例,读者可以自行实现)
在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。