多态数组
案例:现在定义一个Person类,该类里面有private的name、age属性,和say方法。定义一个Student类,该类有private的score属性,定义一个Teacher类,里面有private的salary属性。
并且Student和Teacher是Person的子类,存在继承关系。
1.创建一个Person的对象,两个Student的对象,两个Teacher的对象,统一放在数组当中,并调用say方法。
Person类
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String setName(String name) {
this.name = name;
return name;
}
public String getName() {
return name;
}
public int setAge(int age) {
this.age = age;
return age;
}
public int getAge() {
return age;
}
public String say() {
return "name="+name+"age="+age;
}
}
Student类
public class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name,age);
this.score = score;
}
public double setScore(double score) {
this.score = score;
return score;
}
public double getScore() {
return score;
}
public String say() {
return super.say()+"score="+score;
}
}
Teacher类
public class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary){
super(name,age);
this.salary = salary;
}
public double setSalary(double salary) {
this.salary = salary;
return salary;
}
public double getSalary() {
return salary;
}
public String say() {
return super.say()+"salary="+salary;
}
}
Test类
public class Test {
public static void main(String[] args) {
//这里题目说放在数组当中,我们知道Person是父类,而Student和Teacher是子类,
//所以定义一个Person类型的数组来存放数据。
Person[] person = new Person[5];
person[0] = new Person("jaek",20);
person[1] = new Student("tom",18,88);
person[2] = new Student("xiaoyang",20,80);
person[3] = new Teacher("wang",28,20000);
person[4] = new Teacher("zhang",45,25000);
for(int i = 0; i < person.length; i++) {
//person[i].say();//动态绑定机制
System.out.println(person[i].say());
}
}
}
输出结果
name=jaekage=20
name=tomage=18score=88.0
name=xiaoyangage=20score=80.0
name=wangage=28salary=20000.0
name=zhangage=45salary=25000.0
2.如何调用子类的特有的方法,比如在Teacher当中有一个teach方法,在Stuedent有一个study方法,如何调用?
首先在Teacher加入teach方法
public void teach() {
System.out.println("老师"+getName()+"在讲课...");
}
在Student加入study方法
public void study() {
System.out.println("学生"+getName()+"正在上课...");
}
主函数main
public class Test {
public static void main(String[] args) {
Person[] person = new Person[5];
person[0] = new Person("jaek",20);
person[1] = new Student("tom",18,88);
person[2] = new Student("xiaoyang",20,80);
person[3] = new Teacher("wang",28,20000);
person[4] = new Teacher("zhang",45,25000);
for(int i = 0; i < person.length; i++) {
//person[i].say();//动态绑定机制
System.out.println(person[i].say());
//报错,无法调用
//person[i].teach();
//person[i].study();
if(person[i] instanceof Student) {
//向下转型
Student student = (Student)person[i];
student.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指向子类,从而调用子类当中特有的方法。
name=jaekage=20
name=tomage=18score=88.0
学生tom正在上课...
name=xiaoyangage=20score=80.0
学生xiaoyang正在上课...
name=wangage=28salary=20000.0
老师wang在讲课...
name=zhangage=45salary=25000.0
老师zhang在讲课...
如有错误,还望指正。