多态

  2018-4-17 


JAVA多态

多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,消除类型之间的耦合关系。这改善代码组织结构、可读性、扩展性。

向上转型与向下转型是多态的体现,它允许我们不管子类,编写的代码只与该子类的基类打交道

比如直观地:Fruit apple = new Apple()

  1. 绑定

    问题:当子类和父类存在同一个方法(接口)时,子类重写父类方法(接口)时候,程序在运行时调用该方法应该调用子类还是父类的该方法?所以我们需要用绑定来确定调用那种方法

    定义:将一个方法调用同一个方法主体关联起来称作绑定

    前期绑定:在程序执行前进行绑定(若有,由编译器和连接程序进行实现),面向过程语言默认此方式

    后期绑定:在运行时根据对象的类型进行绑定,也叫动态绑定或运行时绑定。方法的动态绑定是基于实际的对象类型,而不是它们声明的对象引用类型

    Java中所有方法都是通过动态绑定实现多态的,于是我们只需要发送消息给某个对象,让该对象在运行时去判断应该做什么事情,也就是说我们可以通过调用父类引用正确地访问子类方法。然而子类中有而父类中没有的方法无法被调用,因为它标明的是父类引用。

    动态绑定具体细节https://zhuanlan.zhihu.com/p/24317613

  2. 可拓展性,减小耦合

    即:将改变的事物和未变的事物分离开来,比如乐器都有一个play方法,是不变的;而不同乐器的形状是改变的,这时候就可以设计instrumentpiano,violin的基类,只需要将子类引用向上转型为基类引用,统一调用instrument类的play方法即可,以后新添子类也不需要改动基类,只需要创建一个子类新继承自基类即可

  3. 只有普通的方法可以动态绑定对象,也就是说只有普通方法调用可以是多态的。成员变量(域)和静态方法都不具备多态性 (TiJ P156)

  4. 静态方法是与类,而非与单个对象相关联的,不具备多态性


且听风吟