4.多态(Thinking in java学习四)
多态
通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。
==多态存在的三个必要条件==:
- 要有继承
- 要有重写
- 父类引用指向子类对象
转机
方法调用绑定
- 绑定:将一个方法调用同(与)一个方法主体关联起来被称作绑定。
- 前期绑定:若在程序执行前绑定,叫做前期绑定。
- 后期绑定(动态绑定,运行时绑定):在运行时根据对象的类型进行绑定。
编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用。Java中除了static方法和final方法之外,其他所有方法都是后期绑定。
注意:final的使用可以有效地关闭动态绑定。
产生正确的行为:
Java中的所有方法都是通过动态绑定实现多态的。
可扩展性
在一个良好的OOP程序中,大多数或者所有方法都会遵循tune()的模型,而且只与基类通信。
“覆盖”私有方法
只有非private方法才可以被覆盖。导出类中,对于基类的private方法,最好采用不同的名字。即使子类存在父类private方法相同的方法也不会覆盖,而是当作两个独立的方法。
域与静态方法
域与静态方法不存在多态,即不需要动态绑定。
注意:静态方法属于类,并不是与单个对象相关联的。
构造器和多态
构造器是static方法,构造器如何在通过多态在复杂的层次结构中运作?
构造器的调用顺序
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上连接,以使每个基类的构造器都能得到调用。
注意:构造器有一项特殊任务:检查对象是否被正确地构造。
所以调用每个基类的构造器,才有权限和正确初始化每个基类的构造,这样才能完整且正确地构造出一个对象。
继承与清理
通过组合与继承方法来创建新类时,永远不用担心对象的清理问题,子对象通常都会留给垃圾回收器处理。若真要进行清理,则需要特意为该类写dispose()的清理方法。在覆盖清理方法时,需要先调用基类清理方法。
对象销毁顺序应该与初始化顺序相反。
构造器内部的多态方法的行为
问题:如果一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么?
分析:一般的方法内部,动态绑定的调用是在运行时才决定的。在基类构造器中调用导出类中覆盖基类的方法,此时会发生调用混乱。
注意:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。构造器中唯一能安全调用的方法是基类中的final和private方法。
初始化的实际过程(完整):
- 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零;
- 如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法;
- 按照声明的顺序调用成员的初始化方法;
- 调用导出类的构造器主题;
协变返回类型
Java SE5中新增了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
协变返回类型允许覆盖方法时,将基类方法返回类型修改为其返回类型的某种导出类型。
用继承进行设计
组合与继承设计的区别:
组合能在运行期间决定切换不同对象,获得了动态灵活性,但是我们不能在运行期间决定继承不同的对象。
设计原则:用继承表达行为间的差异,并用字段表达状态上的变化。
class Actor { public void act(){} }class HappyActor(){ public void act(){ print("HappyActor");} }class SadActor(){ public void act(){ print("SadActor");}}class stage{private Actor actor = new HappyActor();public void change(){ actor = new SadActor();}public void performPlay(){ actor.act(); }
}
纯继承与扩展
采取纯粹的方式来创建继承层次结构似乎是最好的方式,即只有在基类中已经建立的方法才可以在导出类中被覆盖。
is-a 纯粹的继承,is-like-a 有着相同的基本接口,但是它还具有其他的额外方法。
向下转型与运行时类型识别
基类转导出类称为向下转型。
Java进入运行期时仍然会对类型进行检查,这种在运行期间对类型进行检查的行为称为“运行时类型识别”(RTTI)。
4.多态(Thinking in java学习四)相关推荐
- java学习四个月以来的想法
java学习四个月以来的想法 从五月开始接触编程到现在差不多四个月了,其实我在2018年的时候就听别人介绍过编程,因为我自己学得是工科类专业,掌握一门编程语言对自己以后有好处,所以才在今年开始学习 ...
- Java学习四阶段-07 服务注册中心Nacos
Nacos注册中心简介 背景分析 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系 ...
- Java学习四阶段-09 Sentinel限流熔断
Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...
- Java学习(四)异常
异常的定义:非正常的;不同于平常的异常现象.在编程中,发现了不正常的事情是异常. 异常的由来:问题也是现实生活中的事物,所以可以把所有的异常封装成对象,在报错的时候,自动调用,也就是对不正常情况进行描 ...
- Java学习四阶段-JUC并发包
文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...
- Java学习系列及数据结构博客全目录
Java学习系列 Java学习系列(一)Java的运行机制.JDK的安装配置及常用命令详解 Java学习系列(二)Java注释.标识符.基本数据类型及其转换易错点详解 Java学习系列(三)Java运 ...
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
今天内容比较多,直接步入正题吧. 类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
最新文章
- 面试官问你想找什么工作_找工作时如何面试面试官
- 小shell脚本---查找目录下面包含string的文件
- L型四驱越野模型车初期磨合指南
- 零成本学Arduino单片机之入门
- CUDA从入门到精通(零):写在前面
- python求最小公倍数_python求最大公约数和最小公倍数的简单方法
- sql语句优化总结 mysql_MySQL-SQL优化总结
- 看看DelayQueue源码
- 基于Hexo+Node.js+github+coding搭建个人博客——基础篇
- 268、缺失数字(python)
- 超详细Java安装教程,小白速来!!!
- MIKE21学习总结(一)
- 什么是LSI关键词?LSI关键词怎么用?2019
- 微服务架构下的统一身份认证和授权
- 2016最新iOS开发证书配置和安装的详细步骤攻略
- Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术
- 从零实现一个RPC框架系列文章(二):11个类实现简单RPC
- 各项异性扩散滤波 -- OpenCV实现
- 测试用例(功能用例)——登录、首页、个人信息
- ensp配置ssh后无法远程连接问题