1.1.1 多态的意义
一个类型的引用在指向不同的对象时会有不同的实现。依然借助前面案例中的 Person类、Student类和 Teacher 类举例,看如下的代码:
- Person p1 = new Student();
- Person p2 = new Teacher();
- p1.schedule();
- p2.schedule();
同样声明为 Person 类型的变量 p1和p2,当指向不同的对象时,可以有不同的表现。这种现象在 Java中被称为多态。
多态是面向对象的三大基本特征之一,包含:
2、行为多态
- 个体多态
- 行为多态
1、个体多态
- 父类型定义的变量引用的子类型个体是多种多样的,如:Person变量可以引用Student、Teacher、Worker对象等
- 个体多态是用向上造型实现的
- 父类型变量引用子类型实例后,执行方法时候可以得到多种结果,如:Person变量分别引用Student、Teacher、Worker对象时候执行schedule方法得到的结果不同
- 行为多态是利用方法重写实
-
案例示意代码如下:
- public class PolyDemo1 {
- public static void main(String[] args) {
- // 使用父类引用指向子类对象 -> 子类向上造型
- Person p1 = new Student("Tom", 12);
- Person p2 = new Teacher("Andy", 28);
- Person p3 = new Worker("Jerry", 28);
- // 父类引用调用抽象方法,实际执行子类实现的方法
- // -> 行为多态
- p1.schedule();
- p2.schedule();
- p3.schedule();
- // 父类引用仅能访问父类中声明的成员
- // 父类应用无法访问子类中声明的成员
- // p1.study(); // 编译错误,无法访问
- }
- }
1.1.5【案例】多态的扩展应用示例
在上一个案例的基础上,使用数组存储多个对象,统一执行其 schedule() 方法。
案例示意代码如下:
- package oop_04.polymorphic;
- public class PolyDemo2 {
- public static void main(String[] args) {
- // 多态数组
- Person[] array = {new Student("Tom", 12)
- ,new Teacher("Andy", 28)
- ,new Worker("Jerry", 28)};
- for(int i=0;i<array.length;i++) {
- test(array[i]);
- }
- Student s1=new Student("Lucy",15);
- // 子类类型的对象也可以传入该方法
- test(s1);
- }
- /**
- * 方法的参数为父类形态
- * 该父类的任意子类对象均可以传入该方法
- * @param person
- */
- public static void test(Person person){
- person.schedule();
- }
- }