多态(超详细)
一:认识多态
(1)封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为
(2)多态
指对的多种形态,我们可以用new关键字去创建一个学生对象,把这个对象赋值给Student类型,就表示这个Student对象现在是学生形态,这也是我们以前创建对象的方式。有了多态以后,我们再创建对象的时候还可以把学生对象赋值给他的父类类型Person,这就表示这个学生对象现在是人的形态。此时学生对象就有了两种形态,一个是上面的学生形态Student s = new Student();还有一个就是人形态Person p = new Student();这就是多态。
(3)多态的应用场景
假设在学生管理系统中有三个角色,学生老师和管理员。每一个角色在使用系统前他都是需要注册账号的,注册账号在代码里面家设计就是一个regist方法干的事情,此时方法的形参写什么类型的比较好呢?如果写Student类型,Teacher和admin怎么处理?如果写Teacher类型,Student和admin怎么处理?要实现这个效果,在以前我们只能写三个注册方法,分别和老师学生管理员对应。但是这种方法很不好,甚至很愚蠢。如果现在再添加一个角色辅导员,是不是还要再添加一个方法?
我们现在要的是不是一个通用的注册方法?这个方法既能接收老师,有能接收学生和管理员。为了解决这个问题,我只能在形参写他们共同的父类Person,这样就可以解决刚刚的问题了。现在传递一个Student过去,就变成了Person p = new Student();就是我们刚刚说的多态,注册其他类型的对象也是一样的。而且更重要的是,如果说在方法里面我用对象调用其他的方法,只要子类重写了这个方法,多态还可以根据你传递对象的不同,调用不同类里面的方法。如果传递的是老师,调用的就是老师里面的show方法。
public void registry(Person p ) {
p.show();
}
(4)什么是多态?
同类型的对象,表现出的不同形态。
(5)多态的表现形式?
父类类型 对象名称 = 子类对象。
(6)多态的前提?
1、有继承关系
2、有父类引用指向子类对象:Fu f = new Zi();父类引用指的就是=左边Fu类类型的变量,指向就是中间的=,子类对象就是=右边new 出来的这部分
3、有方法重写
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(23);
Teacher teacher = new Teacher();
teacher.setName("李四");
teacher.setAge(24);
Admin admin = new Admin();
admin.setName("王五");
admin.setAge(25);
registry(student);
registry(teacher);
registry(admin);
}
public static void registry(Person person) {
person.show();
}
}
class Person {
private String name;
private int age;
public void show() {
System.out.println(name + "," + age);
}
}
class Student extends Person{
@Override
public void show() {
System.out.println("学生的星系为:" + getName() + getAge());
}
}
class Teacher extends Person{
@Override
public void show() {
System.out.println("老师的信息为:" + getName() + "," + getAge());
}
}
class Admin extends Person{
@Override
public void show