75.多态概述
在Java中,对象变量是多态的。一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象。
以多态的形式来传递参数,增强了参数类型的灵活性。
现在假设有一个类Aclass,由它派生了一个子类Bclass,那么,我们可以将子类Bclass的对象赋给父类变量:
Aclass a = new Bclass();
这其实体现了Java中的所谓“替换原则(substitution principle)”:无论何时,只要程序需要一个父类对象,那么就可以用一个子类对象来替代它。
多态带来的一个明显的好处就是:以多态的形式来传递参数,增强了参数类型的灵活性。
例如,我们需要在学校管理系统的某个类(假设为CalClass)中定义一个方法来根据学生或老师的年龄来计算相应的出生年代(此处“Teacher”类和“Stucent”类均为“Person”类的子类),可以这样来定义这个方法:
public class CalClass{
… …
public int calTeacherBirthYear(Teacher t){
// 根据参数t的年龄来计算教师的出生年代
}
public int calStudentBirthYear(Student s){
// 根据参数s的年龄来计算学生的出生年代
}
}
如果使用多态的概念,我们只要定义一个方法来计算就可以了:
public class CalClass{
.. …
public int calPersonBirthYear(Person p) {
// 根据参数p的年龄来计算出生年代
}
}
如果需要计算某个学生的出生年代,只需要将这个学生对应的对象当作参数传递给这个方法,如果需要计算某个老师的出生年代,只需要将这个老师对应的对象当作参数传递给这个方法。
在使用多态来传递参数的时候,有一个问题需要注意:一个对象只能有一种确切的数据类型,如果将一个变量声明为父类的引用类型,那么,即使它引用的对象是某个子类的对象,编译器也只是将这个对象当作是父类型对象,因此,若一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
比如,我们用Person来声明一个变量,然后再将这个变量指向Teacher,这个时候,就不能用这个变量来调用子类Teacher特有的方法或属性了:
Person p;
p = new Teacher();
p.setDepartment(“数学教研室”);//错误
除了父类和子类之间的这种多态机制外,接口和实现它的类之间也可以象父类和子类一样实现多态机制,只需要简单的将接口看成实现它的类的“父类”即可