Java学习 第十三天 多态
1. 什么是多态
- 对象的多种形态
2. 多态的前提
- 有继承、实现关系
- 有父类引用指向子类对象
- 有方法的重写
3. 多态的好处
- 使用父类型作为参数,可以接受所有子类队形,体现多态的扩展性与便利性
代码示例
public class Test {
public static void main(String[] args) {
Person p1 = new Admin();
p1.setName("Sam");
p1.setAge(19);
Person p2 = new Teacher();
p2.setName("Jack");
p2.setAge(30);
Person p3 = new Person("Wiston", 23);
register(p1);
register(p2);
register(p3);
}
//这个方法既能接收老师,又能接收学生,还能接收管理员
//只能把这个参数写成这三个类型的父类
public static void register(Person person) {
person.show();
}
}
运行结果
管理员的信息为:Sam,19
老师的信息为Jack,30
Wiston,23
- 多态的调用成员的特点
变量调用:编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
Animal animal = new Dog();
//现在是用a去调用变量和方法
//而a是Animal类型的,所有默认会从Animal当中去找
理解
成员变量:在子类的对象当中,会把父类的成员变量继承下的,父类:成员变量。子类:成员变量
成员方法:如果子类对方法进行方法重写,那么是会把虚方法表当中父类方法进行覆盖
- 多态的弊端
不能调用子类的特有方法
在编译的时候要先检查父类有没有这个方法,没有就会报错
- 解决方案
变回子类类型就可以
Animal animal = new Dog();
//从父类的animal变回子类的dog就可以
//转换的时候不能乱转换,不然会报错 (报错类转换异常)
Dog dog = (Dog) animal;
//可以用类型判断,判断animal是否是Dog类型
if (animal instanceof Dog)