多态:
编译阶段:编译期间编译器可以根据选择参数的类型来选择使用哪个方法,是因为方法已经通过方法的重载在同一个类里提前写好。(程序在编译时,会在编译类型中检查是否具有所调用的方法。如果编写代码时,使用引用变量调用子类中的特有方法,或者调用重载了父类中的方法,而父类中找不到该方法,则会报编译错误)
运行阶段:运行时,根据输入参数对象的类型(例如,A或者B的实例)来决定调用不同子类的方法(多个类的方法重写)。
多态:在程序运行阶段,调用同一个方法,会根据传进的参数类型不一样,找到相对应的不同子类来执行,从产生不一样的结果。即一种方法对应多种形态称为多态。
多态的好处:不管领养多少不同种类宠物,无需修改主人类的源代码,实现了代码的重用。
多态的实现的三大前提条件:继承、重写、自动转型(用父类的引用接收子类的对象)。
多态的两种实现形式:继承和接口。
- 基于继承的实现机制主要(还有一种是在父类内部封装了方法的返回值,用得不多)表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。
- 基于接口实现的多态是通过重写接口中同一方法的几不同的类体现的。在接口的多态中,使用接口的引用接收实现了该接口的一个类的实例,在运行时,根据对象引用的实际类型来执行对应的方法。由于接口是多继承多实现,它相对于继承来说有更好的灵活性。
ps:与方法不同的是,对象的属性则不具备多态性。通过引用变量来访问其包含的实例属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时所定义的属性。
参考文章:https://blog.csdn.net/sinat_30753887 && https://blog.csdn.net/u014207606
接口:
为什么使用接口?
接口干了两件事:一是接口统一了一套规范;二是接口表示了一种能力(像USB接口一样,插上就能用)。
接口和抽象类的区别,啥时候用抽象类?啥时候用接口?
当你关注一个事物的本质的时候,用抽象类; 当你关注一个共有操作的时候,用接口。