本文是对《On Java 8》即《Java编程思想》第五版的知识点汇总整理,仅供学习分享。
多态是面向对象编程语言中,继数据抽象和继承之外的第三个重要特性。
多态提供了另一个维度的接口与实现分离,以解耦做什么和怎么做
把一个对象引用当作它的基类引用的做法称为向上转型,因为继承图中基类一般都位于最上方。
将一个方法调用和一个方法主体关联起来称作绑定。
若绑定发生在程序运行前(由编译器和链接器实现),叫做前期绑定
后期绑定 : 在运行时根据对象的类型进行绑定。后期绑定也称为动态绑定或运行时绑定。
当一种语言实现了后期绑定,就必须具有某种机制在运行时能判断对象的类型,从而调用恰当的方法。
编译器不知道对象的类型,但是方法调用机制能找到正确的方法体并调用
Java 中除了 static 和 final 方法(private 方法也是隐式的 final)外,其他所有方法都是后期绑定
final有效地”关闭了“动态绑定,或者说告诉编译器不需要对其进行动态绑定。这可以让编译器为 final 方法生成更高效的代码。
最好是为了设计使用 final,而不是为了提升性能而使用。
只与基类接口通信。这样的程序是可扩展的,因为可以从通用的基类派生出新的数据类型,从而添加新的功能,操纵基类接口的方法不需要改动就可以应用于新类。
多态是一项“将改变的事物与不变的事物分离”的重要技术。
派生类中的方法名采用与基类中 private 方法名不同的命名。
只有普通的方法调用可以是多态的。
如果你直接访问一个属性,任何属性访问都被编译器解析,因此不是多态的
如果一个方法是静态(static)的,它的行为就不具有多态性,因为静态的方法只与类关联,与单个的对象无关。
组合不会强制设计是继承层次结构,而且组合更加灵活,因为可以动态地选择类型(因而选择相应的行为),而继承要求必须在编译时知道确切类型。
有一条通用准则:使用继承表达行为的差异,使用属性表达状态的变化
纯粹的替代意味着派生类可以完美地替代基类。基类可以接收任意发送给派生类的消息,因为它们具有完全相同的接口。只需将派生类向上转型,不要关注对象的具体类型。所有一切都可以通过多态处理。
派生类中接口的扩展部分在基类中不存在(不能通过基类访问到这些扩展接口),因此一旦向上转型,就不能通过基类调用这些新方法
由于向上转型(在继承层次中向上移动)会丢失具体的类型信息,那么为了重新获取类型信息,就需要在继承层次中向下移动,使用向下转型。