多态致力于分离做什么和怎么做。意味着一个类型可以同时指代多种类型。
向上转型
把某个对象的引用视为对其基类的引用,即是向上转型。
在方法中把形参定义为基类,应用向上转型,只需一个方法,就可以作用于基类和其所有的导出类。如基类Instrument,子类为Wind,那么将方法定义为tune(Indtrument),tune方法也就适用于Wind类(tune(Wind)),日后如果再定义一个导出类也不用再额外定义或修改tune方法了。
由于后期绑定的原因,甚至可以把一个导出类的对象引用赋予给一个一个基类引用,在运行时编译器会自动选定使用导出类的方法的。
在数组中也可以利用向上转型定义一个包含各种子类的基类数组。
向上转型是绝对安全的,因为导出类一定大于等于基类,基类的方法在导出类中一定存在。
注意,向上转型并不适用于实例域,final方法和static方法,由于private方法是自动final的,切对导出类不可见,故向上转型即便同名也并不会覆盖基类的private方法,极有可能会错误调用到基类方法。
构造器在导出类的创建过程中是逐级向上调用的,以为只有上一级的构造器才有权限初始化上一级自有的实例域。导出类构造器会默认调用基类的默认构造器,除非用super()指定。
更纯粹的继承就是基类与导出类的方法完全一样,这种关系是is-a关系,但更灵活的方式是导出类扩展方法,这被称为is-like-a关系,但扩展出来的方法并不能在向上转型后被使用,若要使用,只能向下转型,这将涉及到RTTI。