什么是多态
顾名思义多态就是让一个对象拥有不同的形态
举例如下
多态的应用场景,比如你注册的时候,你可能注册为学生,老师,管理员,但是此时你往函数传递的类型是什么呢,此时你无论传递什么都不太合适,我们最好的是传递父类,这样无论你向这个函数中传递学生还是老师或者管理员,这个函数都能够成功的接收,不会报错
什么是多态
- 同类型的对象,表现出的不同形态
多态的表现形式
- 父类类型对象名称 = 子类对象;除了我们现在自己构建的类的对象,我们遇到的最常见的多态就是集合的多态
比如
public class test {
// 用来测试这个java中的集合类的多态
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
System.out.println(list);
}
}
其中这个 list 就是一个父类,然后这个 Arraylist 就是一个子类
关于集合的文章请参考我的这一篇文章
集合的笔记
多态的前提
- 有继承关系
- 有父类引用指向子类对象
- 有方法重写
多态方式创建对象
Fu f = new Zi();
调用成员变量的时候,编译看左边,运行也看左边
再编译的时候会看左边的父类中有没有这个变量,如果有则编译成功,如果没有则编译失败。
调用成员方法的时候, 编译看左边, 运行看右边
我们再 javac 编译的时候我们先看父类中有没有这个变量, 如果有则编译成功, 如果没有则编译失败
但是再运行的时候调用的确实子类的方法, 因为这里面涉及到了方法的重写, 父类的方法被再虚方法表中被覆盖掉了.
多态的优势和弊端
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
刚开始我们想让学术工作, 但是后面几天我们想让老师去工作, 这个时候我们就只需要改变这个 student 就行了
定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
当我们向 StringBuilder 中添加数据的时候我们可以添加所有的对象类型, 这就是因为这个 obj 是所有的对象的父类, 满足多态的定义
我们定义集合的时候我们可以设置这个添加类型在尖括号里面, 如果我们不写这个尖括号, 那么我们就可以添加任意类型的数据
多态的优势
我们在调用方法的时候不能调用子类的特有功能, 因为这样编译就通过不了.
解决方案
我们将这个父类类型转换为子类类型就可以了
Animal a = new Dog();
a.lookhouse();//报错
Dog b = (Dog) a;//强制类型转换
转换的时候不能进行瞎转化, 猫不能转换为狗, 所以我们在转换的时候要进行判断这个转换是不是合理的 e
JDK 14 以后感觉这个写的太麻烦了, 添加了一个新特性, 可以将转化和判断写在一行