0x00 多态
1.概述
面向对象三大特征:封装性、继承性、多态性。
继承性是多态性的前提。
extends继承或者implements实现,是多态性的前提。
一个对象拥有多种形态,这就是:对象的多态性。
2.多态的格式和使用
代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
格式
父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
3.多态中成员变量的使用特点
- 直接通过对象名称访问成员变量:看等号左边是谁,有限用谁,没有则向上找。
- 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
4.多态中成员方法的使用特点
在多态代码当中,成员方法的访问规则是:
看New的是谁,就有限用谁,没有则向上找。
注意:编译看左边,运行看右边。
对比:
成员变量:编译看左边,运行还看左边。
成员方法:编译看左边,运行看右边。
5.使用多态的好处
无论右边new的时候换成了哪个子类对象,等号左边调用方法都不会变化。
6.对象向上转型
- 对象向上转型,其实就是多态写法:
格式:父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把它当做父类来看待使用。
注意事项:向上转型一定是安全的。
7.对象向下转型
对象向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端。
对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。
解决方案:用对象的向下转型【还原】。
2. 对象的向下转型,其实是一个【还原】的动作。
格式:子类名称 对象名 = (子类名称)父类对象;
含义:将父类对象,【还原】成本来的子类对象。
注意事项:
以动物举例子。
- 必须保证对象本来创建的时候,就是猫,才能向下转型成为猫。
- 如果对象创建的时候本来不是猫,现在想要向下转型变成猫,就会报错。
简单来说,就是你在向上转型的时候是什么,向下转型才能变成什么,如果非要变成别的东西,就会报错。
对象向下转型,类似于强制数据类型转换。
8.使用instanceof关键字进行类型转换
Q:如何才能知道一个父类引用的对象,本来是什么子类?
A:使用instanceof关键字。
格式:
对象 instanceof 类型
这将会得到一个布尔值结果,也就是判断前面的对象能不能当做后面类型的实例。