P185 多态的概述
多态性的前提:extends继承/implements实现
究竟什么是多态性?
如:
人类–》学生类
- 小明是【学生类】对象
- 小明既是【学生】
- 也是【人类】
- 有【多种形态】====》对象的多态性
P186 多态的格式与使用
格式:
**父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称(); **
即:父类引用指向子类对象
public static void main(String[]args){
//使用多态的写法
//左侧父类的引用,指向了右侧子类的对象
Fu obj=new Zi();
obj.method();//出来的是子类方法method
obj.methodFu();//出来的是父类方法
子类会被当成父类使用
P187 多态中成员变量的使用特点
要知道【访问成员变量的两种方式】:
- 直接通过【对象名称访问成员变量】:【等号左边】是谁优先用谁,没有就向上找
- 间接通过【成员方法访问成员变量】:【方法属于谁】就用谁的,没有就向上找
-
关于【属于谁】:若子类中重写了,那就属于子类,否则还是属于父类
Fu obj=new Zi();//Fu类对象obj指向子类
obj.num=10;//用的是---obj(Fu类中的num)
P188 多态中成员方法的使用特点
成员方法的访问规则:
- 看new的是谁,就优先用谁,没有则向上找
- 口诀:编译看左边,运行看右边
对比:
- 【成员变量】编译、运行都看左边
- 【成员方法】编译看左边,运行看右边
网友说:子类有重写,才能用子类,否则用父类(存疑
P189 使用多态的好处
为啥要让Fu类掺和进来呢?
- 前情提要:继承和实现都能作为多态的前提
解答:
- 当父类只想调用两个子类的实现方法,而不管各自怎么实现时用多态很方便
好处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化
- 即:new A/B/C 下一行都是one.work();//one就是employee类型
P190 对象的向上转型
其实就是多态写法(父类引用指向子类对象):
- 父类名称 对象名 = new 子类名称();
理解:右侧创建一个子类对象,把它当作父类来看待使用
(向上转型示例图)
【向上转型一定是安全的】
- ∵从小范围转向大范围(安全
double num=100;//正确的✔,int---》double,自动类型转换
P191 对象向下转型
向上转型的弊端:
一旦向上转型为父类,就无法调用子类原本特有的内容
cat已经向上转型了,animal不能再调用catchmouse()
向下转型==【还原】:
本来是a,才能称为【还原】
格式:
- 子类名称 对象名 = (子类名称)父类对象;//像强制类型转化的格式!!
- 含义:将父类对象还原为本来的子类对象
Animal animal=new Cat();//注意new的是一只猫!
animal.eat();//猫吃鱼
//animal.catchMouse();//错误写法!
//向下转型,进行“还原”动作
Cat cat=(Cat)animal;
cat.catchMouse();//向下转型,进行“还原”动作
//看一个错误的向下转型
//本来new的是一只猫,现在非要当作一只狗
//Dog dog=(Dog)animal;//大错特错!!
(报错:ClassCastException)
P192 instanceof关键词进行类型判断
如何知道一个父类引用的对象,本来是什么子类?
对象 instanceof 类名称
- 返回的一个boolean值
//如果希望调用子类特有方法,需要向下转型
if(animal instanceof Dog){//判断父类引用animal本来是不是Dog
Dog dog=(Dog) animal;
dog.watchHouse();
}
if(animal instanceof Cat){
Cat cat=(Cat)animal;
cat.eatfish();
}