【《On Java 8》学习之路——多态】知识点整理分享
创始人
2024-03-25 06:50:27
0

文章目录

  • 多态
    • 向上转型回顾
    • 构造器和多态
    • 使用继承设计
    • 多态总结

本文是对《On Java 8》即《Java编程思想》第五版的知识点汇总整理,仅供学习分享。


多态

多态是面向对象编程语言中,继数据抽象和继承之外的第三个重要特性。

多态提供了另一个维度的接口与实现分离,以解耦做什么和怎么做

  • 封装通过合并特征和行为来创建新的数据类型。隐藏实现通过将细节私有化把接口与实现分离
  • 多态方法调用允许一种类型表现出与相似类型的区别,只要这些类型派生自一个基类。这种区别是当你通过基类调用时,由方法的不同行为表现出来的。

向上转型回顾

  • 把一个对象引用当作它的基类引用的做法称为向上转型,因为继承图中基类一般都位于最上方。

  • 将一个方法调用和一个方法主体关联起来称作绑定

  • 若绑定发生在程序运行前(由编译器和链接器实现),叫做前期绑定

  • 后期绑定 : 在运行时根据对象的类型进行绑定。后期绑定也称为动态绑定运行时绑定

  • 当一种语言实现了后期绑定,就必须具有某种机制在运行时能判断对象的类型,从而调用恰当的方法。

  • 编译器不知道对象的类型,但是方法调用机制能找到正确的方法体并调用

  • Java 中除了 staticfinal 方法(private 方法也是隐式的 final)外,其他所有方法都是后期绑定

  • final有效地”关闭了“动态绑定,或者说告诉编译器不需要对其进行动态绑定。这可以让编译器为 final 方法生成更高效的代码。

  • 最好是为了设计使用 final,而不是为了提升性能而使用。

  • 只与基类接口通信。这样的程序是可扩展的,因为可以从通用的基类派生出新的数据类型,从而添加新的功能,操纵基类接口的方法不需要改动就可以应用于新类。

  • 多态是一项“将改变的事物与不变的事物分离”的重要技术。

  • 派生类中的方法名采用与基类中 private 方法名不同的命名。

  • 只有普通的方法调用可以是多态的。

  • 如果你直接访问一个属性,任何属性访问都被编译器解析,因此不是多态的

  • 如果一个方法是静态(static)的,它的行为就不具有多态性,因为静态的方法只与类关联,与单个的对象无关。

构造器和多态

  • 在派生类的构造过程中总会调用基类的构造器。初始化会自动按继承层次结构上移,因此每个基类的构造器都会被调用到
  • 由于属性通常声明为 private,你必须假定派生类只能访问自己的成员而不能访问基类的成员。只有基类的构造器拥有恰当的知识和权限来初始化自身的元素。因此,必须得调用所有构造器;否则就不能构造完整的对象
  • 对象的构造器调用顺序如下:
    1. 基类构造器被调用。这个步骤被递归地重复,这样一来类层次的顶级父类会被最先构造,然后是它的派生类,以此类推,直到最底层的派生类。
    2. 按声明顺序初始化成员。
    3. 调用派生类构造器的方法体。
  • 在构造器中必须确保所有的成员都已经构建完。唯一能保证这点的方法就是首先调用基类的构造器。接着,在派生类的构造器中,所有你可以访问的基类成员都已经初始化。
  • 销毁的顺序应该与初始化的顺序相反,以防一个对象依赖另一个对象。首先进行派生类的清理工作,然后才是基类的清理。
  • 如果在构造器中调用了动态绑定方法,就会用到那个方法的重写定义。然而,调用的结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些 bug 很隐蔽
  • 编写构造器有一条良好规范:做尽量少的事让对象进入良好状态。如果有可能的话,尽量不要调用类中的任何方法。在基类的构造器中能安全调用的只有基类的 final 方法(这也适用于可被看作是 finalprivate 方法)
  • Java 5 中引入了协变返回类型,这表示派生类的被重写方法可以返回基类方法返回类型的派生类型
  • 重写方法时:访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)

使用继承设计

  • 组合不会强制设计是继承层次结构,而且组合更加灵活,因为可以动态地选择类型(因而选择相应的行为),而继承要求必须在编译时知道确切类型。

  • 有一条通用准则:使用继承表达行为的差异,使用属性表达状态的变化

  • 纯粹的替代意味着派生类可以完美地替代基类。基类可以接收任意发送给派生类的消息,因为它们具有完全相同的接口。只需将派生类向上转型,不要关注对象的具体类型。所有一切都可以通过多态处理。

  • 派生类中接口的扩展部分在基类中不存在(不能通过基类访问到这些扩展接口),因此一旦向上转型,就不能通过基类调用这些新方法

  • 由于向上转型(在继承层次中向上移动)会丢失具体的类型信息,那么为了重新获取类型信息,就需要在继承层次中向下移动,使用向下转型

多态总结

  • 多态意味着“不同的形式”。在面向对象编程中,我们持有从基类继承而来的相同接口和使用该接口的不同形式:不同版本的动态绑定方法。
  • 有效地使用多态乃至面向对象的技术,不能只看到单一类中的成员和消息,而要看到类之间的共同特性和它们之间的关系

相关内容

热门资讯

如何修复u盘损坏的文件?   由于U盘经常会在各种不同的电脑上使用,这让它很容易出现一些问题,如u...
排序算法_ 一、选择排序题目arr[0~N-1]范围上,找到最小值所在的位置...
监控圈子行业黑话 文章目录监控圈子行业黑话监控监控系统监控指标全局唯一字符串作为指标标识标签集的组合作为指标标识优雅高...
C++高精度运算(加减乘除) C++中在int 是32位bit是2^32-1。 C/C++基础数字...
【Linux】supervis... 1、简介 Supervisor是一个客户端/服务器系统,它允许用户控制类unix操作系统上的许多进程...
医疗器械免临床申请 仪器免临床的申请主要是基于《医疗器械注册与备案管理办法》47号令 中的第三十四条 第三十四条  有下...
我的2022——从外地回到老家... 0. 引言 转眼间已经到了2023年,从2021年回到家乡后已经过去了2年了。这两年的...
软件测试技术之利用 Jest ... 在本文中我们会具体聊聊如何用 Jest 为 React 组件编写单元测试。 首先我们要明确的一点&#...
互联网产品神话消失:疯狂下架,... 对于各互联网大厂而言,2022年注定是难忘的一年,腾讯CEO马化腾、百度...
Java学习(88)Java集... Java集合——案例:商品信息管理(HashMap增删改查)...