1. 概念:父类引用指向子类对象
2. 语法: 父类类型 引用名=new 子类类型(构造参数); //Animal a=new Panda(); Animal a=new Dog(); //Animal a=new Monkey();
主观类型----->实际类型
父类类型----->子类类型
父类引用----->子类对象
3. 使用
3.1 编译时,父类引用仅可调用自身定义的属性或者方法,不可调用子类特有的属性或者方法
3.2 运行时,优先调用子类覆盖后的方法,如果没有覆盖,则调用父类方法
4. 特点:
4.1 子类对象赋值给父类引用
Animal a=new Dog();
结论:父类引用指向子类对象
4.2 父类引用赋值给子类引用
Animal a=new Panda(); //动物引用指向了Panda对象
Panda p=(Panda)a; //类型强转 实际类型 引用名=(实际类型)父类引用;
结论:父类引用赋值给子类引用时,必须进行强制类型转换(只能编译OK)
运行时,可能出现java.lang.ClassCastException 类型不兼容异常
4.3 不存在继承关系的对象相互赋值
Animal a=new Dog();
Person p=(Person)p; // error 没有继承关系
结论:不存在继承关系的对象,不允许相互转换
5. instanceof (是不是 如:狗是不是动物 狗是不是狗)
语法: 引用名 instanceof 类名
作用: 判断引用指向的对象和后面的类型是否兼容, 兼容为 true ,不兼容为 false ;
Animal a=new Dog();
a instanceof Dog; //true
a instanceof Cat; //false
a instanceof Animal; //true
Animal a1=new Cat();
a1 instanceof Cat; //true
a1 instanceof Dog; //false;
a1 instanceof Animal; //true
6. 应用
6.1 多态应用在方法的参数上
调用方法是,可以传的参数包括父类类型和所有它的子类类型
6.2 多态应用在方法的返回值类型上
调用方法后,可以得到的结果类型包括父类或者它的子类类型
7. 好处
对使用者屏蔽子类之间的不同差异,使得方法调用更简单、灵活通用
注意: 1) 父类引用指向子类对象,且对象的类型始终不变
2) 编译时,父类引用只能调用已经声明的方法
3) 运行时,子类中覆盖的方法优先执行,如果没有覆盖,则执行父类中继承的方法



