多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,消除类型之间的耦合关系。这改善代码组织结构、可读性、扩展性。
向上转型与向下转型是多态的体现,它允许我们不管子类,编写的代码只与该子类的基类打交道
比如直观地:Fruit apple = new Apple()
绑定
问题:当子类和父类存在同一个方法(接口)时,子类重写父类方法(接口)时候,程序在运行时调用该方法应该调用子类还是父类的该方法?所以我们需要用绑定来确定调用那种方法
定义:将一个方法调用同一个方法主体关联起来称作绑定
前期绑定:在程序执行前进行绑定(若有,由编译器和连接程序进行实现),面向过程语言默认此方式
后期绑定:在运行时根据对象的类型进行绑定,也叫动态绑定或运行时绑定。方法的动态绑定是基于实际的对象类型,而不是它们声明的对象引用类型
Java中所有方法都是通过动态绑定实现多态的,于是我们只需要发送消息给某个对象,让该对象在运行时去判断应该做什么事情,也就是说我们可以通过调用父类引用正确地访问子类方法。然而子类中有而父类中没有的方法无法被调用,因为它标明的是父类引用。
可拓展性,减小耦合
即:将改变的事物和未变的事物分离开来,比如乐器都有一个
play
方法,是不变的;而不同乐器的形状是改变的,这时候就可以设计instrument
为piano,violin
的基类,只需要将子类引用向上转型为基类引用,统一调用instrument
类的play
方法即可,以后新添子类也不需要改动基类,只需要创建一个子类新继承自基类即可只有普通的方法可以动态绑定对象,也就是说只有普通方法调用可以是多态的。成员变量(域)和静态方法都不具备多态性 (TiJ P156)
静态方法是与类,而非与单个对象相关联的,不具备多态性