11.多态
在继承的基础上 , 没有继承就没有多态
狗既有狗的形态,又有动物的形态,被称为狗的多态
一个对象有多种形态,成为对象的多态
//用代码体现多态:
父类的引用指向子类对象
(1)格式:
父类名 对象名 = new 子类名();
或
接口名 对象名 = new 实现类名();
例:
Animals hashiqi=new Dog();
hashiqi.run();
hashiqi.methodA();
(2)调用成员方法
多态调用成员方法时:
访问规则:看new的是谁,如果没有就向上找
口诀:编译看左边,运行看右边
多态对象调用成员方法时:
访问规则:
直接方法时,看等号左边是谁,优先用谁,没有就向上找
口诀:编译看左边,运行看左边
(3)多态的好处:
在开发中当我们不强调具体的对象是谁时,使用多态可以增强代码的扩展性
(4)向上造型:
一定是安全的
Animals a1=new Dog();
showAnimalRun(a1);//强制把狗类转换成动物类,就可以调用动物类的内容
Animals a2=new Cat();
showAnimalRun(a2);//强制把猫类转换成动物类,就可以调用动物类的内容public static void showAnimalRun(Animals animals){
animals.run();//调用动物类的方法
}
很多动物奔跑时,利用向上造型就不用在写很多方法了,只调用动物类的一个奔跑就可以
弊端:
一旦向上造型成功,那么无法调用子类原本的特有的内容
解决方案
向下造型(数据的还原):有风险
(5)向下造型
Animals as=new Cat();
//在向下造型的时候需要判断对象是不是相应数据的类型
//instanceof使用格式:你要转的对象 instanceof 要转的类型 -->得到boolean值
if (animals instanceof Dog){
Dog dog=(Dog) a;
}if(animals instanceof Cat){
Cat cat=(Cat)a;
}
(6)引用类型数据传递
Phone手机类
Demo测试类(主类)
public void usePhone(Phone phone){
phone.call( );
}
mian方法中调用
向上造型
Phone p = new NewPhone( );
Demo demo=new Demo( );
demo.usePhone( p );