多态的应用–多态数组
多态数组—定义类型为父类类型,里面保存的实际元素为子类型
应用实例
现有一个继承结构如下:
要求创建1个Person对象,2个Student对象和2个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 say(){
return name+"的信息为:年龄"+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 String say(){
return super.say()+"成绩为"+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 String say(){
return super.say()+"月薪为"+salary;
}
}
//测试类
public class Test001 {
public static void main(String[] args) {
//1.创建Person类型的数组,空间为4.依次创建对象,赋值进数组
Person []persons = new Person [4];
persons[0] = new Student("李涛",22,76);
persons[1] = new Student("李四",25,59);
persons[2] = new Teacher("张宁",35,12000);
persons[3] = new Teacher("杨炎",45,5000);
//2.遍历数组,使用数组下标,根据运行类型依次输出say方法
for (int i = 0; i < persons.length; i++) {
System.out.println(persons[i].say());
}
}
}
输出结果
问题升级----------
学生和老师类现新增一个学习方法和教学方法。要求在输出信息的时候同时调用各自的方法。
- 因为数组的引用类型是Person,所以不能直接调用他们私有的方法。因此联想到可以使用向下转型来调用、
- 但是有个问题在于,数组中不只是一个子类型的对象,分别有两个不同子类的对象
- 可以利用instanceOf关键字,判断是哪个类。然后分别向对应的进行向下转型,然后调用子类特有的方法
//Person类
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String say(){
return name+"的信息为:年龄"+age;
}
public String getName() {
return name;
}
}
//Student类
public class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public String say(){
return super.say()+"成绩为"+score;
}
public void Study(){
System.out.println(getName()+"正在学java");
}
}
//Teacher类
public class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
public String say(){
return super.say()+"月薪为"+salary;
}
public void teach(){
System.out.println(getName()+"正在教学");
}
}
//测试类
public class Test001 {
public static void main(String[] args) {
//1.创建Person类型的数组,空间为4.依次创建对象,赋值进数组
Person []persons = new Person [4];
persons[0] = new Student("李涛",22,76);
persons[1] = new Student("李四",25,59);
persons[2] = new Teacher("张宁",35,12000);
persons[3] = new Teacher("杨炎",45,5000);
//2.遍历数组,使用数组下标,根据运行类型依次输出say方法
for (int i = 0; i < persons.length; i++) {
System.out.println(persons[i].say());
//3.创建if语句使用instanceof关键字根据不同的子类型,向下转型,然后调用特有的方法
if (persons[i] instanceof Student){
Student student = (Student) persons[i];
student.Study();
}else{//因为此次传入的只有两个类,所以直接else,后续有更多可以补全
Teacher teacher = (Teacher) persons[i];
teacher.teach();
}
}
}
}