1. 再论向上转型

    • 在某些方法中,仅接收基类作为参数,而不是特殊的导出类,会使得程序更容易扩展。
  2. 转机
    • 方法调用绑定

      • 前期绑定(编译期绑定):在编译期将一个方法调用和方法主体关联起来。
      • 后期绑定(动态绑定或运行时绑定):在程序运行阶段,判断对象类型,将方法调用与方法主体绑定。
      • Java中除static方法和final方法外,其他所有的方法都是后期绑定。
    • 只有非private的方法才可以被覆盖;与private重名的方法,是一个全新的方法。
    • 只有普通的方法调用时多态的。如果访问某个成员变量,则在编译期就根据对象类型确定了所访问的域是基类的还是子类的。
    • 静态的方法不具有多态性。
  3. 构造器和多态
    • 构造器调用过程

      • 调用基类构造器,这个步骤会不断重复下去,直到该层次的根,然后再依次回归。
      • 按声明顺序调用成员的初始化方法。
      • 调用导出类构造器的主体。
    • 继承与清理
      • 在覆盖基类的清理方法时,一定要先调用基类的清理方法。
    • 构造器内部的多态方法的行为
      • 如果在构造器内部调用了导出类中的方法,由于导出类还未初始化,将有可能导致运行时错误。
      • 初始化的实际过程
        • 在上述构造器调用过程之前,首先会将分配给对象的存储空间初始化为0。
      • 编写构造器的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。
      • 在构造器内唯一能够安全调用的方法是基类中的final方法(包括private方法)。
  4. 协变返回类型
    • 表示在导出类 中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
  5. 用继承进行设计
    • 一条准则:用继承表达行为间的差异,用变量表达状态上的变化。
    • 纯继承与扩展
      • 只有在基类中已经建立的方法才可以在导出类中被覆盖,称作纯粹的"is-a"关系。基类和导出类有完全相同的接口。
      • 如果导出类中除了基类的接口,还有扩展接口,则称为"is-like-a"关系。缺陷是扩展接口无法进行向上转型。
    • 向下转型与运行时类型识别
      • 向下转型不一定是安全的,因为必须确定具体的子类对象类型,才能确定是否能够转型。比如运行时对象类型为基类,则将其转为子类时会抛出运行时异常。
      • RTTI(运行时类型识别)机制可以检查转型是否正确。如果运行时转型失败,将抛出异常。

初读"Thinking in Java"读书笔记之第八章 --- 多态的更多相关文章

  1. 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理

    用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...

  2. 初读"Thinking in Java"读书笔记之第二章 --- 一切都是对象

    用引用操纵对象 Java里一切都被视为对象,通过操纵对象的一个"引用"来操纵对象. 例如, 可以将遥控器视为引用,电视机视为对象. 创建一个引用,不一定需要有一个对象与之关联,但此 ...

  3. 初读"Thinking in Java"读书笔记之第九章 --- 接口

    抽象类和抽象方法 abstract void f();抽象方法是仅有声明而没有方法体的方法. 包含抽象方法的类叫做抽象类,如果一个类包含了一个抽象方法,则该类必须限定为抽象类. 抽象类和抽象方法可以使 ...

  4. 初读"Thinking in Java"读书笔记之第七章 --- 复用类

    组合语法 将对象引用置于新类中,即形成类的组合. 引用初始化方法 在定义处初始化. 在类的构造器中初始化. 在使用这些对象之前,进行"惰性初始化". 使用实例初始化. 继承语法 J ...

  5. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  6. 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程

    true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...

  7. 初读"Thinking in Java"读书笔记之第三章 --- 操作符

    更简单的打印语句 导入自己编写的静态类库,即可使用print();打印 使用Java操作符 操作符:+,-,*,/,=,==,!=,+=,?:,%等 几乎所有操作符都只能操作"基本类型&qu ...

  8. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  9. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

随机推荐

  1. python生成可执行exe文件

    为什么要生成可执行文件 不需要安装对应的编程环境 可以将你的应用闭源 用户可以方便.快捷的直接使用 打包工具 pyinstaller 安装pyinstaller pip install pyinsta ...

  2. 二、Python数据类型(一)

    一.Python的基本输入与输出语句 (一)输出语句 print() 示例: print('你好,Python') print(4+5) a = 10 print(a) 输出的内容可以是字符串,变量, ...

  3. Unity3D|-使用ScriptableObject脚本化对象来制作一个简单的对象池

    ScriptableObject是一个用于生成单独Asset的结构.同时,它也能被称为是Unity中用于处理序列化的结构. 可以作为我们存储资源数据的有效方案.同时此资源可以作为我们AB包的有效资源! ...

  4. sass报 error (Line XX: Invalid GBK character "\xE4") 的解决办法

    在webstorm配置的SASS,插入中文注释报错: cmd.exe /D /C call D:\ProgramFiles\Ruby24-x64\bin\sass.bat --no-cache --u ...

  5. jenkin服务关闭和重启

    1.关闭Jenkins http://localhost:8080/exit 2.重启Jenkies http://localhost:8080/restart 3.重新加载配置信息 http://l ...

  6. ubuntu 创建文件夹和删除文件

    创建 名为docker的文件夹 :mkdir docker 删除 名为docker的文件夹 : rm docker 创建名为docker-compose.yml的文件 : vi docker-comp ...

  7. 【转载】BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...

  8. 利用scrapy-client 发布爬虫到远程服务端

    远程服务端Scrapyd先要开启 远程服务器必须装有scapyd,并开启. 这里远程服务开启的端口和ip: 192.166.12.80:6800 客户端配置和上传 先修爬虫项目文件scrapy.cfg ...

  9. 8.1 GOF 设计模式:关于设计模式

    关于设计模式…Design Pattern  追求永恒的美1.1 “模式”一词的起源 “每个模式描述了: 一个在我们周围反复出现的问题, 然后是针对这个问题的解决方案. 这样,其他人可以无数次地反复 ...

  10. 记录Datagrid使用的一些事项

    1.将两个列的文本拼接到一起并显示,如列1为name,列2为code,需要显示name(code).如:小明(123) 则初始化datagrid时在columns[]里加入:列1添加formatter ...