引用类型数组配合多态性可统一管理子类对象并自动调用各自重写方法。它存储对象地址,支持向上造型,遍历调用时按实际类型执行对应逻辑;参数为父类类型的方法亦能接收任意子类实例,增强扩展性;但父类引用不可直接访问子类特有成员,需谨慎向下转型。

引用类型数组配合多态性,是 Java 中实现灵活、可扩展代码的关键组合。它让一个数组能统一管理不同子类对象,并在运行时自动调用各自重写后的方法——不用 if-else 判断类型,也不用重复写调用逻辑。
什么是引用类型数组
引用类型数组存储的是对象的地址,不是对象本身。数组声明时指定的是引用类型(如 Person[]),但实际可以存放该类型及其所有子类的实例。
- 声明语法:Person[] people = new Person[5];
- 允许存入:new Person()、new Student()、new Teacher() 等,只要它们是 Person 的子类
- 本质是“向上造型”:子类对象被当作父类类型来使用,编译期只认父类声明,运行期执行子类逻辑
多态数组的典型写法
把多个子类对象放进同一个父类数组,再遍历调用同名方法,就能自然触发多态行为。
- 示例数组初始化:Person[] roster = { new Student("小明", 20, 89.5), new Teacher("王老师", 38, 12000), new Person("张阿姨", 45) };
- 统一调用:for (Person p : roster) { System.out.println(p.say()); }
- 输出结果取决于每个对象的实际类型:
– Student.say() 输出含 score
– Teacher.say() 输出含 salary
– Person.say() 只输出 name 和 age
多态参数如何配合数组使用
方法参数若声明为父类类型,就能接收任意子类对象——这和多态数组底层逻辑一致,常用于解耦和复用。
- 定义方法:public static void introduce(Person p) { System.out.println(p.say()); }
- 调用时传入任何子类实例:introduce(new Student(...)); 或 introduce(new Teacher(...));
- 结合数组使用更简洁:for (Person p : roster) { introduce(p); }
- 好处:新增子类(比如 Staff)无需修改原有循环或方法,只要继承 Person 并重写 say() 即可
注意事项与常见误区
多态带来便利,但也有限制,需特别注意访问权限和成员可见性。
- 父类引用不能直接访问子类特有成员:roster[0].getScore() 编译报错(即使第 0 个是 Student)
- 如需调用子类特有方法,必须向下转型:((Student) roster[0]).getScore(),但要先用 instanceof 判断类型,避免 ClassCastException
- 数组本身是固定长度的;如需动态增删,应改用 ArrayList
,它同样支持多态 - 所有存入的子类对象,必须重写父类中被调用的方法(如 say()),否则将执行父类默认实现











