多态
- 继承和接口是多态的前提
- 父类引用指向子类对象
- 格式:
父类名称 对象名 = new 子类名称
接口名称 对象名 = new 实现类名称
一. 成员变量访问
- 直接访问成员变量,看等号左是谁,就优先用谁,没有则向上找
- 通过成员方法间接访问成员变量,看该方法属于谁就有先用谁,没有则向上找
- 编译看左边,运行还看左边
二. 成员方法访问
- 看new的是谁就有先用是谁,没有则向上找
- 编译看左边运行看右边
Fu obj = new Zi(); // 自动编译时看左边的父类有没有方法,若子类中已经覆盖重写了则用子类
obj.methodZi(); // 子类成员方法
obj.methodZi(); // 错误写法,不能向下访问
- 子类特有的方法不能向下访问,若要访问需要向下转型
三. 对象的向上转型
- 其实就是多态的写法:
- 父类名称 对象名 = new 子类名称
// 向上转型
Animal animal = new Cat();
- 就相当于把子类当成父类看待,多态写法会发生自动的向上转型,所以一定是安全的
四. 对象的向下转型
- 格式:
子类名称 子类具体对象名 = (子类名称) 多态对象名
// 向下转型
Cat cat = (Cat) animal;
- 但不能转换为其他类型,否则会运行报错
五. instanceof关键字
- 作用:判断多态对象本来的子类具体是哪一个
- 格式:
if(多态对象名称 instanceof 子类名称){
子类名称 子类具体对象名 = (子类名称) 多态对象名;
}
// 判断具体对象是哪一个
if (animal instanceof Cat) {
//向下转型
Cat cat = (Cat) animal;
cat.play(); // 猫玩球
} else if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.watch();
}