【《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)

使用继承设计

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

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

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

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

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

多态总结

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

相关内容

热门资讯

求瑜亮文(或三国的其他同人文,... 求瑜亮文(或三国的其他同人文,像策瑜啊。都可以 )已发送,请查收。
我有个女同事人很精明,他总是在... 我有个女同事人很精明,他总是在男同事面前装傻,私下恶意攻击我们女同事,现在很多女同事都因为她走了,那...
关于《封神榜国际版》天庭神树任... 关于《封神榜国际版》天庭神树任务的问题!在医生那接任务,然后找人组队,组上3人以上就没一个怪都有一个...
差强人意和强差人意。在解释上有... 差强人意和强差人意。在解释上有何区别?差强人意和强差人意。在解释上有何区别?强差人意是香港自创词汇!...
如果取名字焱字有什么意思? 如果取名字焱字有什么意思?用字分析焱:火花,火焰。唐诗宋词旧游成梦寐,往事随阳焱。-白居易《开元寺东...
芦花鸡最大的缺点 芦花鸡最大的缺点生长速度慢。芦花鸡最大的缺点就是生长速度慢,主要是因为歼神芦花氏悄亏鸡对环境和饲料的...
两天近两万人次参观,香港市民“... 转自:央视新闻客户端昨天(5日),山东舰编队开放参观进入第2天,两天共有近两万人次登上祖国巨舰参观,...
为什么有的人一辈子吸烟还那么长... 为什么有的人一辈子吸烟还那么长寿吸烟与长寿是没有直接关系的如果说有那也是间接关系——吸烟的人比不吸烟...
相识13天闪婚,4个月后妻子车... 转自:扬子晚报7月2日,极目新闻报道了山东27岁女子认识河北男子13天闪婚,4个月后突遭车祸去世。4...
世界和平论坛|金砖对国际秩序变... “金砖的现代化和扩员发出了一个强有力的信息,也就是20世纪的机制必须要通过演变来面对21世纪的挑战,...