实例
假如现在需要制作一个用户注册系统,可注册的种类有老师、学生、管理员
但是注册用户方法的形参只能写一个类型,如果写 Student ,那么此方法就只能提供 “学生” 身份的注册,而无法注册 “老师”、“管理员” 。
public void register(Student st) {
//注册代码逻辑
}
如果我们想要让此方法能够注册三种不同的用户就只能使用方法的重载,但是这样成本太高,有几种用户就要写几次,如下图
public void register(Student st) {
//注册代码逻辑
}
public void register(Teacher te) {
//注册代码逻辑
}
public void register(Administrator ad) {
//注册代码逻辑
}
解决方法:1.我们可以让所有的子类继承父类
public class Student extends Person{ Student类继承Person类
}
public class Teacher extends Person{ Teacher类继承Person类
{
public class Administrator extends Person{ Administrator类继承Person类
{
2.并且对每个子类的 register 进行重写,重写为子类独特的形态,即学生提示学生,老师提示老师,管理员提示管理员
public void register() { //父类中的方法
}
@Override
public void register() {
System.out.println("学生的信息为:"+getId()+","+getName());//学生类中的方法重写
}
@Override
public void register() {
System.out.println("老师的信息为:"+getId()+","+getName());//老师类中的方法重写
}
@Override
public void register() {
System.out.println("管理员的信息为:"+getId()+","+getName());//管理员类中的方法重写
}
3.Student 、Teacher、Administrator 都是继承父类 Person 的子类,在使用时遵循编译看左边,运行看右边,即左边写父类,右边写子类
Person stu= new Student(1,"学生");
Person tea= new Teacher(2,"老师");
Person adm= new Administrator(3,"管理员");
4.在main函数运行的方法 register 形参中可以填写父类类型
public static void register(Person p)
{
p.register();
}
5.调用成员方法 register :
register(stu);
register(tea);
register(adm);
运行结果,可以看到每个种类的用户所输出的都为本类重写过的方法,即学生提示学生,老师提示老师,管理员提示管理员
以上为多态的体现,我们只定义了一个方法 register ,但是此方法可以接收的参数却有3种形态
多态的必要条件:
1.要有继承
2.父类引用指向子类对象(将子类对象赋值给父类类型)
3.有方法的重写(每个子类的方法各不相同)
多态的好处
使用父类类型作为参数,可以接收所有子类对象。
多态的弊端
不能使用子类的特有方法
假如给子类 “Student” 定义一个方法 “study” ,
public void study()
{
System.out.println("学生在学习");
}
此时对 Student 中的 study方法 进行调用,结果报错
但是对于从父类Person中继承下来的、改写过的 register 却可以调用, 所以在多态中,子类不能使用自己独特的方法。
类型转换
如果想要调用,则需要进行类型转换,创造一个 Student 类对象C,对其进行类型转换然后接收,C.study将不会报错
Student C = (Student)stu;
C.study();
运行结果,子类 Student 的独特方法成功被打印
instanceof
如果使用上述方法进行转换,类型不一致将会报错,可以使用 instanceof 可对类型进行判断然后转换。
if(stu instanceof Student ){
Student a = (Student) stu;
a.study();
}else if(stu instanceof Teacher ){
Teacher t = (Teacher) stu;
t.teach();
}else if(stu instanceof Administrator ){
Administrator a = (Administrator) stu;
a.management();
}
总结