多态
- 生活中,不同人物角色看待同一个 对象的视角不同,关注点也不同
❂生活中的多态是指 “客观事物在人脑中的主观反应”
❂主观意识上的类别与客观存在的对象具有"is a"关系时,即形成多态。
程序中的多态
-
概念:父类引用指向子类对象,从而产生多种形态。
❂在父类看来,子类可以有多种不同的形态,它们都继承于父类!
-
二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。
❄逻辑上讲:Dog is a Animal ❁语法上讲:(内含自动类型转换)
-
父类引用仅可调用父类所声明的属性和方法、不可调用子类独有的属性和方法。
那么这个时候如果想调用子类中独有的属性和方法就要用到类型转换instanceof
多态中的方法覆盖
-
思考:如果子类中覆盖了父类中的方法,以父类型引用调用此方法时,优先执行父类还是子类中的方法?
• 实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行子类中的方法。
多态的应用
场景一:
- **使用父类作为方法形参实现多态,使方法参数的类型更为宽广。**■
场景二:
instanceof关键字
- 向下转型前,应判断引用中的对象真实类型,保证类型转换的正确性。
- 语法:引用instanceof类型 //返回Boolean结果
public class TestConvert{
public static void mian(String args){
Animal a = new Dog();
//当a引用中储存的对象类型确实为Dog时,再进行类型转换,进而调用Dog中的独有方法。
if(a instanceof Dog){
Dog dog = (Dog)a;
dog.eat();
}else if(a instanceof Dog){
Cat cat = (Cat)a;
cat.eat();
}
}
}
- 如果使用父类作为方法的返回值,那么我们引用时可以用instanceof来加以判断返回值的类型,再予以转换
总结
-
父类引用指向子类对象,从而产生多种形态。
-
多态的两种应用场景:
使用父类作为方法形参,实现多态。
使用父类作为方法返回值,实现多态。
❁·多态的作用:
- 屏蔽子类间的差异。
- 灵活、耦合度低。