- 面向对象的三大特征:封装、继承、多态
-
多态的格式和使用
1.代码中体现多态性,就是一句话:父类指向子类对象
格式:
父类名称 对象名 = new 子类名称();
Fu obj = new Zi();
或者:
接口名称 对象名 = new 实现类名称();
1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
Fu obj = new Zi();
2.间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
1.在多态的代码中,成员方法访问规则是:
看new的是谁,就优先用谁,没有则向上找
Fu obj = new Zi();
2.口诀:编译看左边,运行看右边
对象的向上转型其实就是多态写法 --> 父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象, 把它当做父类来看待使用
Animal animal = new Cat();
含义:右侧创建了一个猫,把它当做动物来看待,从小范围到大范围
弊端:一旦向上转型,就没办法调用子类特有的方法,解决方法用向下转型
Animal {
eat();
}
Cat extends Animal{
eat()
catchMouse();
}
对象的向下转型,其实是一个【还原】的动作
格式:子类名称 对象名 = (子类名称) 父类对象
含义:将父类对象,【还原】成为本来的子类对象
Animal animal = new Cat();
Cat cat = (Cat) animal;
注意:
对比向上转型,向下转型是有危险的,类似与duoble转换为int,由大到小
想安全就用instanceof关键字
如何才能知道一个父类引用的对象,本来是什么子类???
格式:
对象 instanceof 类名称
这将返回一个boolean值,也就是判断前面的对象能不能当做后面类型的实例
if(animal instanceof Cat){
方法体:判断结果为true,就将animal向下转型为Cat
}