多态数组(进阶)
应用实例:现有一个继承结构如下:要求创建1个Person对象、2个Student 对象和2个Teacher对象, 统一放在数组中,并调用每个对象say方法
进阶:给每个子类型成员加一个特有的方法,并调用输出,(学生特有方法-听课(study)、老师特有方法-讲课(teach))
本题重点: person[i] 编译类型是 Person ,运行类型是是根据实际情况由JVM来判断,即同编译类型,不同运行类型,对象的多态!
主类-PloyArray
package com.hspedu.poly_.polyarr_;
public class PloyArray {
public static void main(String[] args) {
//应用实例:现有一个继承结构如下:要求创建1个Person对象、
// 2个Student 对象和2个Teacher对象, 统一放在数组中,并调用每个对象say方法
Person person[] = new Person[5];
person[0] = new Person("jack",20);
person[1] = new Student("mary",18,100);
person[2] = new Student("smith",19,80);
person[3] = new Teacher("scott",30,19999);
person[4] = new Teacher("king",50,25000);
//循环遍历多态数组,调用say
for (int i = 0; i < person.length; i++) {
//提示: person[i] 编译类型是 Person ,运行类型是是根据实际情况有JVM来判断
System.out.println(person[i].say());//动态绑定机制
//这里使用 类型判断 + 向下转型.
if (person[i] instanceof Student){//判断person[i] 的运行类型是不是Student
Student student = (Student)person[i];//向下转型
student.study();//也可以使用一条语句 ((Student)persons[i]).study();
}else if(person[i] instanceof Teacher){
Teacher teacher = (Teacher)person[i];
teacher.teach();
}else if(person[i] instanceof Person){
}else{
System.out.println("你的类型有误,请自己检查!");
}
}
}
}
父类-Person
package com.hspedu.poly_.polyarr_;
public class Person {//父类
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String say(){//返回名字和年龄
return name + "\t" + age;
}
}
子类-Student
package com.hspedu.poly_.polyarr_;
public class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
//重写父类的say方法
@Override
public String say() {
return "学生 "+super.say() + "\t" + "score=" + score;
}
//特有方法
public void study(){
System.out.println("学生 " + getName() + " 正在听课...." );
}
}
子类-Teacher
package com.hspedu.poly_.polyarr_;
public class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//重写父类的say方法
@Override
public String say() {
return "老师 "+super.say() + "\t" +"salary=" + salary;
}
//特有方法
public void teach(){
System.out.println("老师 " + getName() + " 正在讲课....");
}
}
运行结果